عند مناقشة محتويات كائن الطلب، إحدى المجموعات التي يجب دراستها هي مجموعة ServerVariables. تحتوي هذه المجموعة على مزيج من القيمة الموجودة في رأس HTTP المرسلة من العميل إلى الخادم مع طلب الصفحة، والقيمة المقدمة من الخادم نفسه عندما يتلقى الطلب.
تحتويالقيمة التي يتم إرجاعها بواسطة
الصفحة "المرجعية الذاتية"
في مجموعة ServerVariables على تفاصيل خادم الويب ومعلومات مسار الصفحة الحالية.يمكن استخدام هذه المعلومات في أي مكان تقوم فيه بإنشاء صفحة. على سبيل المثال، لإنشاء صفحة "مرجع ذاتي" يمكنها استدعاء نفسها مرة أخرى لإكمال مهمة أخرى، يمكننا استخدام الكود التالي:
<FORM ACTION="<% = Request.ServerVariables("PATH_INFO") %>" METHOD= "POST ">
يمكن الحصول على نفس التأثير باستخدام قيمة HTTP "SCRIPT_NAME":
<FORM ACTION="<% = Request.ServerVariables("SCRIPT_NAME") %>" METHOD="POST">
استخدم العنصر <A> لـ افتح صفحة مختلفة، يمكنك استخدام:
...
<%
strFullPath = Request.ServerVariables("PATH_INFO")
'قم بإزالة اسم الملف
strPathOnly = Left(strFullPath, InStrRev(strFullPath, “/”))
strNextPage = strPathOnly & "pages/next_page.asp"
%>
...
<A HREF=”<% = strNextPage %>”>الصفحة التالية</A>
...
تعمل هذه الأمثلة حتى إذا تغير اسم الصفحة الأصلية أو موقعها، لأنه يتم استخدام معلومات مسار الصفحة الحالية (بالطبع، يفشل المثال الثاني عندما يتغير اسم الصفحة المستهدفة المنفصلة).
بمعنى آخر، إذا تم إنشاء عنوان URL تلقائيًا للجلسة الفرعية لمحرك البحث، فيمكن جمع بعض قيم ServerVariable:
strFullURL = http:// & Request.ServerVariables("LOCAL_ADDR") _
& ": & Request.ServerVariables("SERVER_PORT") _
& Request.ServerVariables("PATH_INFO")
سيؤدي هذا إلى إنشاء عنوان URL كاملًا يتضمن رقم المنفذ (في هذه الحالة، ليس القيمة القياسية 80). على سبيل المثال، قد تكون النتيجة:
http://194.74.60.254:1768/thispath/thispage.asp
الكشف عن إصدار المستعرض
قيمة أخرى مفيدة في مجموعة ServerVariables هي سلسلة وكيل المستخدم لمستعرض المستخدم. في صفحة "الكشف عن نوع المستعرض" (browsertype.asp)، يتم استخدام قيمة "HTTP_USER_AGENT" في مجموعة ServerVariables للحصول على سلسلة وكيل المستخدم. يتم استخدام بعض البرامج النصية لتحليل هذه المعلومات والعثور على اسم الشركة المصنعة وإصدار المستعرض.
<%
strUA = Request.ServerVariables("HTTP_USER_AGENT")
Response.اكتب "سلسلة وكيل المستخدم هي <B>" & strUA & "</B>"
"
إذا كان InStr(strUA، "MSIE") ثم
الرد.اكتب "لترقية المتصفح الخاص بك، انتقل إلى "_
& “<A HREF=” & Chr(34) & http://www.microsoft.com/ie/ ”_
& مركز حقوق الإنسان (34) & "> http://www.microsoft.com/ie/ <A>
"
intVersion = Cint(Mid(strUA, InStr(strUA, “MSIE”) + 5, 1))
إذا كان intVersion >=4 إذن
Response.اكتب "يمكنك استخدام Microsoft Dynamic HTML"
نهاية إذا
آخر
إذا كان InStr(strUA، "Mozilla") ثم
إذا كان InStr(strUA, "compatible;") = 0 إذن
Response.اكتب "من المحتمل أن يكون متصفحك هو Navigator، ويمكنك "_.
& “قم بتنزيل أحدث إصدار من Navigator من”_
& “<A HREF=” & Chr(34) & http://home.netscape.com/ ”_
& “تنزيل/”& Chr(34) & “> http://home.netscape.com ”_
& "/تنزيل/</أ>
"
intVersion = Cint(Mid(strUA, InStr(strUA, “/”) +1, 1))
إذا كان intVersion >= 4 إذن
Response.Write "ربما يمكنك استخدام Netscape Dynamic HTML"
نهاية إذا
آخر
strVersion = Mid(strUA, InStr(strUA, "متوافق;") + 12)
strProduct = Left(strVersion, InStr(strVersion, " "))
الرد.اكتب "متصفحك متوافق مع Navigator، يمكنك ذلك" _
& “ابحث عن الشركة المصنعة باستخدام محرك بحث مثل”_
& "<A HREF=" & Chr(34) _
& "http://www.altavista.digital.com/cgi-bin/query?q="_
&strProduct_
& مركز حقوق الإنسان(34) & “> http://www.altavista.com/ </A>
"
نهاية إذا
نهاية إذا
نهاية إذا
%>
تختلف نتائج البحث عن IE 5.0 وNavigator 4.61 على التوالي. بالنسبة للمتصفحات من الشركات المصنعة الأخرى، يمكنك الحصول على رابط لبدء البحث عن اسم الشركة المصنعة تلقائيًا على موقع ويب Alta Vista.
لاحظ أن Netscape لا يوفر اسم الشركة المصنعة في سلسلة وكيل المستخدم، لذلك ليس هناك ضمان مطلق بأن المتصفح هو Navigator.
اكتشاف لغة المتصفح
هناك قيمة أخرى مفيدة في مجموعة ServerVariables وهي "HTTP_ACCEPT_LANGUAGE"، والتي تحتوي على رمز اللغة الذي يتم تحديده عند تثبيت المتصفح، أو يتم ترميزه بشكل ثابت في الإصدار الإقليمي للمستخدم. ومن أمثلة رموز اللغات en-us (المملكة المتحدة والولايات المتحدة) وde-at (ألمانيا وأستراليا) وes-pe (إسبانيا وبيرو).
يمكن أن تكون رموز اللغة عامة وتحذف معرفات اللهجات: على سبيل المثال، في موقعنا Wrox، يستخدم عدد كبير من الزوار en (الإنجليزية) كرمز للغة.
ولذلك، يمكن اكتشاف رمز اللغة وتحميل الإصدار المناسب الخاص بالمنطقة أو اللغة الخاصة بالصفحة تلقائيًا.
StrLocale = Lcase(Left(Request.ServerVariables("HTTP_ACCEPT_LANGUAGE"),2))
حدد حالة strLocale
الحالة "en": Response.Redirect "http://uk_site.co.uk/"
الحالة "de": Response.Redirect "http://de_site.co.de/"
الحالة "fr": الاستجابة. إعادة التوجيه "http://fr_site.co.fr/"
'...إلخ
حالة أخرى: Response.Redirect "http://us_sitel.com/"
النهاية حدد
الصفحة أو أعد توجيهها بناءً على لهجة محددة:
strLocale = Lcase(Request.ServerVariables("HTTP_ACCEPT_LANGUAGE"))
حدد حالة strLocale
الحالة "en-gb": Response.Redirect "http://uk_site.co.uk/"
الحالة "en-us": Response.Redirect "http://us_site.com/"
الحالة "es-pe": Response.Redirect "http://es_site2.co.pe/"
'...
حالة أخرى: Response.Redirect "http://us_site1.com/"
إنهاء تحديد
لقيم مجموعة ServerVariables الأخرى المفيدة
الوصول إلى أي عضو في مجموعة ServerVariables واستخدامه للتحكم في الطريقة التي تستجيب بها صفحة ASP للطلب. يمكنك التحقق مما إذا كان الزائر قد وصل إلى الموقع باستخدام المنفذ الافتراضي 80 أو منفذ آخر. في هذا المثال، ابحث عن الوصول عبر المنفذ 443 - الذي يوفر الوصول إلى طبقة المقابس الآمنة (SSI) (والبروتوكولات الأخرى) - وأعد توجيههم إلى الصفحة المناسبة.
إذا Request.ServerVariables("SERVER_PORT") = "443") إذن
Response.Redirect "/securesite/default.asp" 'مستخدم آمن
آخر
Response.Redirect "/normalsite/default.asp" "مستخدم غير آمن".
النهاية إذا
كان المتصفح مطالبًا بالتسجيل والتحقق من الخادم (بدلاً من السماح له بالوصول بشكل مجهول ضمن حساب IUSER الخاص بخادم الويب، فستتم مناقشة هذه المشكلة بالتفصيل في فصل لاحق)، فيمكن أن يكون اسم المستخدم تم الاستعلام عنه لتحديد المستخدم الذي يتعامل معنا ومن هو وما إذا كان سيتم تحميل الصفحة لهذا المستخدم. على سبيل المثال، التعليمة البرمجية التالية سوف تعرض فقط رابط الإدارة للمستخدمين الذين يحملون اسم Administrator.
...
<A HREF=”dispcnfg.asp”>تغيير تكوين العرض</A>
<A HREF=”dispcolr.asp”>تغيير ألوان العرض</A>
<A HREF=”keyboard.asp”>تغيير تكوين لوحة المفاتيح</A >
<%
إذا كانت Request.ServerVariables("AUTH_USER") _
= Ucase(Request.ServerVariables("SERVER_NAME")) & "Administrator" ثم
%>
<A HREF=”allusers.asp”>إدارة كافة المستخدمين</A>
<A HREF=”usrlogon.asp”>إدارة معلومات تسجيل الدخول</A>
<%
نهاية إذا
%>
...
لاحظ أن ASP لا يقوم بملء مجموعة ServerVariables حتى تتمكن من الوصول إلى أحد أعضائها. سيؤدي الوصول إلى عضو في هذه المجموعة لأول مرة إلى حصول IIS على كل ذلك، ويجب استخدام مجموعة ServerVariables فقط عند الحاجة.
تقنيات الطلب والاستجابة الأخرى
الآن، دعونا نلقي نظرة على بعض التقنيات المفيدة لاستخدام كائنات الطلب والاستجابة، بما في ذلك:
· إدارة الاتصالات، والتخزين المؤقت، وإعادة توجيه الصفحة.
· تشغيل رؤوس HTTP والتخزين المؤقت وصفحات "انتهاء الصلاحية".
· الاستفادة من شهادات العملاء.
· إنشاء رسائل ملف السجل المخصصة.
1. إدارة الاتصالات والتخزين المؤقت وإعادة توجيه الصفحات
إحدى الميزات المفيدة جدًا لـ ASP هي تمكين المستخدمين من إعادة التوجيه من صفحة ويب ASP إلى صفحة ويب أخرى (ASP أو HTML)، أو إلى ملف مصدر آخر (مثل ملف ZIP أو نص) ملف) ). وهذا واضح للمستخدم، والمتصفح هو الذي يقوم بالعمل في الواقع. عند استخدام أسلوب Response.Redirect لتحميل صفحة ويب جديدة، يتم في الواقع إرسال رأس HTTP خاص مرة أخرى إلى العميل. هذا الرأس هو:
HTTP/1.1 302 Object Moved
الموقع /newpath/newpage.asp
يقرأ المتصفح معلومات الرأس هذه ويقوم بتحميل الصفحة وفقًا لتوجيهات قيمة الموقع. وهذا من الناحية الوظيفية هو نفس استخدام علامة HTML <META> من جانب العميل في صفحة ويب، على سبيل المثال:
<META HTTP-EQUIV="REFRESH" CONTENT="0;URL=/newpath/newpage.asp">
يؤدي هذا إلى جلب أ المشكلة هي أن الخادم الوكيل بين الخادم والمستخدم قد يقدم رسالة خاصة به تحتوي على رابط للصفحة الجديدة، بدلاً من تحميل الصفحة الجديدة مباشرة. وقد تقوم المتصفحات بنفس المهمة اعتمادًا على الشركة المصنعة والإصدار. يؤدي هذا إلى إزالة الشفافية المفترضة ويجعل الوصول إلى موقعك أكثر تعقيدًا بالنسبة للمستخدم مع استمراره في تلقي رسائل الخطأ.
بعد إرسال أي محتوى صفحة مثل النص أو HTML، لم يعد بإمكاننا استخدام طريقة إعادة التوجيه. ومع ذلك، إحدى الطرق التي يبدو أنها تحد من "تأثير الخادم الوكيل" هي التأكد أولاً من عدم إرسال أي مخرجات (بما في ذلك رؤوس HTTP) إلى العميل. في ASP 2.0، يجب عليك تشغيل التخزين المؤقت ثم استخدام الأسلوب Clear لمسح المخزن المؤقت:
Response.Buffer = True
'بعض الشروط لاختيار الصفحة المناسبة:
إذا Request.ServerVariables("SERVER_PORT") = 1856 إذن
StrNewPage = "/newpath/this_page.asp"
آخر
StrNewPage = "/newpath/the_other_page.asp"
نهاية إذا
الاستجابة.واضحة
Response.Redirect strNewPage
في ASP 3.0، يتم تشغيل التخزين المؤقت بشكل افتراضي، لذلك يمكن تجاهل السطر الأول، ولكنه غير ضار ويضمن أن صفحة الويب الخاصة بنا ستظل تعمل حتى في بيئة ASP 2.0.
بدلاً من استخدام هذا النوع من إعادة توجيه رأس HTTP، من الأفضل استخدام ميزة جديدة لـ ASP 3.0، والتي تتيح لنا التحويل لتنفيذ صفحة ويب أخرى من خلال طريقة النقل لكائن الخادم، وسندرس هذه المشكلة بشكل أكبر في المستقبل .
1) المخزن المؤقت لصفحة ASP
كما رأيت، يتم تشغيل المخزن المؤقت لصفحة ASP 3.0 افتراضيًا في IIS 5.0، ويتم إيقاف تشغيله افتراضيًا في الإصدارات السابقة. تخبرنا Microsoft أن التخزين المؤقت يوفر تسليمًا أكثر كفاءة لصفحات الويب في IIS 5.0، ولهذا السبب تم تغيير الحالة الافتراضية للتخزين المؤقت. في معظم الحالات، هذا ليس له أي تأثير علينا. ومع ذلك، إذا كان لديك صفحة ويب كبيرة جدًا، أو صفحة ويب يستغرق إنشاؤها بعض الوقت باستخدام ASP أو تعليمات برمجية ومكونات أخرى من جانب الخادم، عند اكتمال أجزائها، يمكننا تحديثها على دفعات للعميل:
.. .
... كود لإنشاء الجزء الأول من الصفحة
...
الاستجابة. فلوش
...
... كود لإنشاء الجزء التالي من الصفحة
...
الاستجابة. فلوش
...
في بعض الأحيان قد ترغب في إيقاف تنفيذ التعليمات البرمجية في مرحلة ما قبل نهاية الصفحة، عن طريق استدعاء الأسلوب End لتحديث كل المحتوى الحالي للعميل وإلغاء أي معالجة إضافية.
...
... كود لإنشاء الجزء الأول من الصفحة
إذا strUserName = "" ثم Response.Clear
...
... كود لإنشاء نسخة جديدة من هذا الجزء من الصفحة
...
فيما يلي مثالان لصفحات الويب التي توضح التخزين المؤقت وإعادة التوجيه، والتي يمكن تنزيلها من صفحة "كائن الاستجابة" الرئيسية (sow_response.asp). تم تسمية صفحة الويب الأولى لمثال Response.Redirect باسم redirect.asp، وهي تقوم بإدراج بعض المحتوى في الصفحة المخزنة مؤقتًا، ومسح المخزن المؤقت، وإعادة التوجيه إلى صفحة ويب أخرى:
For intLoop = 1 إلى 1000000.
الرد.اكتب "."
التالي
الاستجابة.واضحة
الاستجابة.إعادة التوجيه "show_redirect.asp"
Response.End
show_response.asp بنفس المهمة، ولكن إعادة التوجيه تعود إلى الصفحة الرئيسية لـ "Response Object". ونظرًا لأن هذه الصفحات مخزنة مؤقتًا ويجب مسح جميع المخرجات قبل إعادة التوجيه، فلا يوجد أي مخرجات مرئية في المتصفح. ومع ذلك، يمكن رؤية كل عملية إعادة توجيه تحدث من خلال مراقبة حالة المتصفح. كما هو موضح في الشكل أدناه:
<img src=/u/info_img/2009-06/25/asp14.jpg>
في الصفحة الرئيسية "Response Object"، انقر فوق الارتباط "Response.Flush" لفتح نموذج صفحة الويب الثانية usebuffer.asp. إنه ببساطة يتكرر عبر كل حرف من السلسلة ويرسلها إلى العميل مع تأخير معين. وعلى الرغم من أن هذا استخدام غير فعال للغاية لخوادم الويب وASP، إلا أنه يوضح كيفية عمل التخزين المؤقت.
<img src=/u/info_img/2009-06/25/asp15.jpg>
ما يلي هو الحد الأدنى المطلوب لرمز ASP. لاحظ أننا نقوم بتحديث كل حرف إلى المتصفح بشكل منفصل، وإلا فسيتم تخزينه في المخزن المؤقت حتى اكتملت صفحة الويب:
strText = "تم نقل هذا النص إلى المتصفح باستخدام " & _
"<B>Response.Flush</B>
"
بالنسبة إلى intChar =1 إلى Len(strText)
بالنسبة لـ intWrite = 1 إلى 100000
التالي
الاستجابة.كتابة منتصف (strText،intChar،1)
الاستجابة. فلوش
التالي
2) خاصية Response.IsClientConnected
خاصية IsClientConnected موجودة بالفعل في ASP 2.0، ولكنها غير موثوقة إلى حد ما. يجب إرسال بعض المخرجات إلى العميل قبل أن يقوم بإرجاع نتيجة دقيقة. تم حل هذه المشكلة في ASP 3.0. يمكن الآن استخدام هذه الخاصية بحرية.
تعد IsClientConnected طريقة مفيدة لمراقبة ما إذا كان المستخدم لا يزال متصلاً بالخادم ويقوم بتحميل صفحة الويب التي أنشأها ASP. إذا قام المستخدم بقطع الاتصال أو توقف عن التنزيل، فلن نضطر إلى إضاعة موارد الخادم في إنشاء صفحة الويب لأنه سيتم تجاهل محتويات المخزن المؤقت بواسطة IIS. لذلك، بالنسبة لصفحات الويب التي تتطلب الكثير من الوقت لحساب أو استخدام الكثير من الموارد، فمن المفيد التحقق في كل مرحلة مما إذا كان المتصفح غير متصل بالإنترنت:
...
... كود لإنشاء الجزء الأول من الصفحة
...
إذا كان Response.IsClientConnected ثم
الاستجابة. فلوش
آخر
الاستجابة.النهاية
نهاية إذا
...
... كود لإنشاء الجزء التالي من الصفحة ...