الفرق بين Server.Execute وExecute في ASP لتنفيذ البرامج النصية الديناميكية، يمكن للأصدقاء المحتاجين الرجوع إليه. لقد خططت مؤخرًا لمحاولة تنفيذ بنية MVC في ASP. لا بد أن أحدهم سألني: لقد تم حذف ASP، لماذا لا أزال أدرسه؟ أعرف هذا أيضًا منذ أن تخلت Microsoft عن ASP 3.0 وتحولت إلى ASP.NET، فقد تأخرت ASP كثيرًا عن PHP وJSP، اللتين بدأتا في نفس الوقت تقريبًا. إن فوائد المصدر المفتوح على المصدر المغلق هي نفس فوائد PHP وASP يُقال إنه لا يمكن لأحد أن ينقذه من الإزالة، ولكن تجدر الإشارة إلى أن ASP لا يزال منتشرًا على نطاق واسع في السوق الصينية، خاصة بالنسبة لبعض تطبيقات بعض الشركات الصغيرة والمتوسطة الحجم مشكلة، ومن السهل نشره في بعض أنظمة Windows القديمة، ولا حاجة إلى تثبيت .NET يمكن تشغيل إطار العمل بشكل مباشر، لذلك لا يزال من الضروري إعداد إطار عمل، ومع ذلك، فإن إطار العمل الخاص بي هو إطار عمل تجريبي، فقط للتحقق مما إذا كان ASP يمكنه تنفيذ بنية MVC مشابهة لـ PHP.
حسنًا، بعد أن قلت الكثير، دعونا ندخل في صلب الموضوع مباشرة. سبب هذه المشكلة هو أنني بحاجة إلى تضمين ملفات ASP ديناميكيًا. كما نعلم جميعًا، هناك طريقة تضمين واحدة فقط في ASP، وهي SSI (تضمين جانب الخادم)، والتي تنقسم بشكل أساسي إلى النوعين التاليين:
انسخ رمز الكود كما يلي:
<!-- #include file=sample.asp -->
<!-- #include virtual=sample.asp -->
في الأساس، الأول هو الأكثر استخدامًا بين هذين الاثنين. #include virtual يحتوي على المسار الظاهري، والذي يستخدم بشكل عام في الدلائل الافتراضية. لكن كلاهما ثابت إذا أردنا تضمينه ديناميكيًا، فلا يمكن كتابته على النحو التالي:
انسخ رمز الكود كما يلي:
<!-- #include file=<%=MyVar%> -->
<!-- #include virtual=<%=MyVar%> -->
الكتابة أعلاه خاطئة ويمكن أن نفهم أنه يتم تنفيذ التوجيه #include قبل أن يبدأ ASP محرك البرنامج النصي وينفذ البرنامج النصي بين علامات ASP<% %>، وبعبارة أخرى، فإن #include ليس من عمل ASP، ولكن برنامج الخادم مثل أعمال ترجمة IIS، لذلك لن ينتبه إلى رمز ASP الخاص بك.
كيفية تنفيذ أساليب البرنامج النصي للتضمين الديناميكي المشابهة لطرق تضمين PHP وinclude_once وrequire وrequire_once؟ دعونا نلقي نظرة على أسلوب كائن ASP Server: Server.Execute، بالبحث في كافة ميزات ASP، يمكننا أن نجد أن هذه الوظيفة هي الأكثر تشابهًا مع التضمين الديناميكي، ويمكننا إجراء تجربة:
Sample.inc.asp
انسخ رمز الكود كما يلي:
<%
الرد.اكتب مرحبا بالعالم!
%>
test.asp
انسخ رمز الكود كما يلي:
<%
Server.Execute Sample.inc.asp
استجابة.اكتب أنا test.asp!
%>
يجب أن يكون الإخراج الفعلي هو Hello World!I am test.asp!، مما يشير إلى أن Server.Execute يمكن أن يعمل بشكل جيد مع التضمين الديناميكي، ولكن ماذا لو كنت أرغب في تضمين فئة أو وظيفة؟ بعد ذلك قم بالتجربة التالية:
Sample.class.asp
انسخ رمز الكود كما يلي:
<%
عينة الصف
نهاية الفصل
%>
test.asp
انسخ رمز الكود كما يلي:
<%
Server.Execute Sample.class.asp
الاستجابة.اكتب اسم النوع (التقييم (نموذج جديد))
%>
قم بتشغيله مباشرة، ولم يتم تحديد فئة الخطأ "800a01fa" خطأ وقت تشغيل Microsoft VBScript: "نموذج"، والنتيجة مخيبة للآمال للغاية، لماذا يحدث هذا؟ لقد قمت بفحص MSDN ووجدت هذا الوصف: إذا تم تضمين ملف في صفحة الاتصال باستخدام #include، فلن يستخدمه ملف .asp الذي تم تنفيذه. على سبيل المثال، قد يكون لديك روتين فرعي في ملف تم تضمينه في صفحة الاتصال الخاصة بك. لكن ملف .asp الذي تم تنفيذه لن يتعرف على اسم الروتين الفرعي، ويبدو أنه يختلف بعض الشيء عن المشكلة التي واجهتها. هل تم عزل رمز Server.Execute؟ ثم قم بإجراء التجربة التالية:
Sample.inc.asp
انسخ رمز الكود كما يلي:
<%
خافت مايفار
MyVar = أنا عينة!
%>
test.asp
انسخ رمز الكود كما يلي:
<%
خافت مايفار
MyVar = أنا اختبار!
Server.Execute Sample.inc.asp
الاستجابة.اكتب MyVar
%>
النتيجة هي أنني اختبار! وهو أمر مخيب للآمال للغاية! يبدو أن Server.Execute يعزل المتغيرات والوظائف والفئات والرموز الأخرى، مما يعني أن نهاية الاتصال والنهاية المستدعىة لا تتداخل مع بعضها البعض على مستوى التعليمات البرمجية. يبدو أنه لا يمكن استخدام Server.Execute إلا لتضمين ملفات . قوالب أسب.
ما يلي هو تنفيذ ميزة البرنامج النصي VBScript. ما يتم تمريره إلى التنفيذ يجب أن يكون رمز برنامج نصي VBScript صالحًا، والتنفيذ حساس للسياق.
test.asp
انسخ رمز الكود كما يلي:
<%
تنفيذ نموذج الفصل: نهاية الفصل
الاستجابة.اكتب اسم النوع (التقييم (نموذج جديد))
%>
يقوم الكود أعلاه بإخراج اسم النوع الذي نحتاجه بنجاح. لقد أثبت أن Execute يمكن أن يكون حساسًا للسياق، لكن المشكلة هي أن استخدام Execute لتضمين ملفات asp ليس مناسبًا مثل Server.Execute الذي يأتي مع برامج VBScript النصية. أولاً، يمكن استخدامه فقط لتنفيذ نص التعليمات البرمجية ، لذلك يجب قراءة محتوى الملف مرة واحدة ثانيًا، لا يمكن استخدام بعض العلامات لتحديد ASP، مثل <% %>، وهناك طريقة استدعاء مشابهة لـ <%=MyVar %>، لذلك تحتاج إلى تصفية <. % %>، ثم قم بتحويل <%=MyVar %> إلى Response.Write MyVar. نظرًا لأن ما أحتاج إليه هو تضمين ملفات الفئة، فلن يظهر <%=MyVar %>، فأنا بحاجة فقط إلى استبدال <% %>. لقراءة محتويات الملف واستبعاد <% %> ببساطة، يمكنك الرجوع إلى الوظيفة التالية:
انسخ رمز الكود كما يلي:
الوظيفة file_get_contents(اسم الملف)
ديم فسو، ف
تعيين fso = Server.CreateObject(Scripting.FilesystemObject)
تعيين f = fso.OpenTextFile(Server.MapPath(filename), 1)
file_get_contents = f.ReadAll
و. إغلاق
تعيين و = لا شيء
تعيين fso = لا شيء
وظيفة النهاية
الدالة class_get_contents(اسم الملف)
محتويات خافتة
المحتويات = file_get_contents (اسم الملف)
المحتويات = استبدال (المحتويات، < & %، )
المحتويات = استبدال (المحتويات، % &>،)
class_get_contents = المحتويات
وظيفة النهاية
باستخدام الوظيفة المذكورة أعلاه يمكننا اختبار الكود التالي مباشرة:
Sample.class.asp
انسخ رمز الكود كما يلي:
<%
عينة الصف
نهاية الفصل
%>
test.asp
انسخ رمز الكود كما يلي:
<%
تنفيذ class_get_contents(Sample.class.asp)
الاستجابة.اكتب اسم النوع (التقييم (نموذج جديد))
%>
النتيجة الناتجة هي اسم نوع العينة الذي توقعناه. يبدو أن Execute لا يزال قويًا جدًا، وهو بالفعل قوي جدًا، لأن الأشخاص ذوي النوايا السيئة غالبًا ما يستخدمونه لإنشاء المهور الجملة التالية :
انسخ الكود كما يلي: <%Execute Request(c)%>
على سبيل المثال، يوجد هذا البرنامج النصي في file.asp، ثم قم بتمرير file.asp?c=Trojan text، هاها، أنت تعرف بالفعل الشيء التالي. حسنًا، هذا استطراد. شيء آخر يجب ملاحظته حول Execute هو أنه مرتبط بالسياق، لذا انتبه إلى مشكلة النطاق. إذا كان Execute موجودًا داخل عملية فرعية أو وظيفة دالة، فلا يمكن الوصول إليه من الخارج.