Thursday, May 19, 2011

يوم في حياة صفحة ASP.NET

كم من صفحة ASP.NET بنيتُها ثم تركتاها ولم أعلم عنها شئ بعد ذلك، ياترى ماذا تفعل الآن وإن طلبها المستخدم أمازلت تلبي النداء أم أن شئ ما في يومها تكدر فلم تعد تجيب النداء وبدلاً من أن أفكر في كل صفحة بعد بنائها قررت أن أعرف كيف تقضي أي صفحة ASP.NET يومها حتى لا أكدره عليها بالخطأ أثناء بنائي إياها وأليكم مذكرات يوم في حياة صفحة ASP.NET
لا تبادر أي صفحة ASP.NET ببدء يومها من نفسها بل يعتمد بداية يومها على طلب المستخدم لها وعلى الرغم من عدم قدرتها على التنبؤ بالوقت الذي ستبدأ فيها يومها – أو قل وقت استيقاظها – إلا إنها تعرف تمام المعرفة الأماكن التي عليها أن تمر عليها كل يوم، واستحييت أن أكون أنا مبرمجها ولست على نفس درايتها بالأماكن التي تمر فيها والغرف التي تقضي فيها وقتها ففضلت البدء بمعرفة الغرف التي تقضي الصفحة فيها وقتها ثم استطلع كل غرفة جيدا ثم بعد ذلك أعطي لها أمر بالاستيقاظ وأراقبها أثناء مرورها على كل هذه الأماكن  لأتعرف بالتفصيل على رحلتها اليومية وسأبدأ بسرد ما علمته عن الغرف التي تقضي فيها وقتها وهي كالتي : [MORE]
1- غرفة ال IIS
        وعزمت في هذه الغرفة إلا أخرج إلا بعد أن أفهم الآتي :
        - نظرة عامة
        - ماذا يحدث تحت الغطاء
أما عن النظرة العامة
فهذه الغرفة هي المكان المختص باستقبال طلبات تشغيل صفحة ويب معينة والمسئول عن خدمة هذه الطلبات هو خادم   Internet Information Services (IIS) وهو يعتبر الوسيط الذي لا غنى عنه بين المستخدم وبين موقع الانترنت وذلك لأنه يستطيع التعامل مع المستخدم وطلباته ويعرف كيفية الرد عليه بالأسلوب الذي يفهمه المستخدم وفي نفس الوقت قادر على التعامل مع ملفات موقع الانترنت بما يناسبها ونقل نتيجة تشغيلها إلي المستخدم ، ولا تقتصر خدماته على صفحات ASP.NET فقط بل تمتد إلي Classic ASP و HTML وأي تقنيه تدعم IIS وأولى ملاحظاتي على هذه الغرفة كانت كما يلي :
-    لن يتمكن أي طلب لصفحة ويب من المرور إلا عن طريق توجيه طلبه إلي IIS  وإلا فلا يمكن خدمته.
-    ليس هناك إلا طريق واحد فقط لطلب تشغيل صفحة عن طريق IIS وهو ما يطلق عليه ال HTTP Request يكون محدد فيه عنوان الصفحة المستهدفة بالإضافة إلي معلومات أخرى.
-    أي نتيجة تخرج من IIS إلي المستخدم يجب أن تخرج في HTTP Response يحتوى نتيجة طلب المستخدم
-    تعمل جميع إصدارات IIS التي تسبق IIS 6.0 تحت اسم inetinfo.exe أما في حالة IIS 6.0 فأنه يعمل تحت اسم w3wp.exe
أما عن ما يجدث تحت الغطاء فكان كالتالي
يستطيع ال IIS تمييز الصفحات عن طريق الامتداد الخاص بها مثل .html  .asp .aspx وبالتالي تغيير طريقة تعامله مع الصفحة بما يناسب التقنية المبنية بها، وتغيير طريقة تعامله هي أكثر من مجرد ثلاث كلمات لذا استوقفني قليلاً فقد سألت نفسي أربع أسئلة وهم كالتالي
     1-    ماذا لو ظهرت لغة جديدة ولتكن XSP لتطوير صفحات ويب فكيف سيغير IIS طريقة تعامله مع الصفحات المبنية بهذه اللغة وهو لم يكن يعرف بها من قبل
2-     ما هي الخطوات التي يتبعها IIS لمعالجة طلبات تشغيل الصفحات المختلفة ؟
3- هل يستطيع IIS حجب بعض الصفحات أو الملفات عن المستخدم حتى وإن كانت موجودة عنده  ؟ وهل يمكنني أن أضبطه بحيث يحجب ملفات خاص بي لا أرغب في أن يطلع عليها المستخدم ؟
      4- كيف سيتصرف IIS إذا تعرف على امتداد صفحة وكان .aspx وعرف أنها ستعمل على ASP.NET وكان هناك نسختين مركبتين منها وهما ASP.NET 1.1 & ASP.NET 2.0
وإجابة السؤال الأول "ماذا لو ظهرت لغة جديدة " كانت كالتالي
علمت مايكروسوفت أنها لن تستطيع أن توفر كل الدعم المطلوب لجميع لغات البرمجة الموجودة والمستحدثة لذا فقد طورت مايكروسوفت نظام Internet Server Application Programming Interface (ISAPI) Extension وهو نظام يهدف إلي إكساب IIS القدرة على توسعة إمكانياته ، بحيث يمكن لأي مبرمج تطوير ISAPI Extension جديد والحاقة بال IIS بحيث يكسب IIS القدرة على التعامل مع أنواع ملفات جديدة لم يكن ال IIS يعلم عنها شيئاً قبل ذلك، وأوضح الأمثلة العملية على ذلك هي ال ASP.NET نفسها فال.NET Framework أثناء تركيبه يلحق ISAPI Extension خاص بال ASP.NETوهو aspnet_isapi.dll بحيث يكسب ال IIS القدرة على معالجة الصفحات المبنية بتقنية ال .NET ويمكن توضيح الفرق قبل تركيب aspnet_isapi وبعد تركيبه وأثر تركيبه على IIS عن طريق الشكلين التاليين :
IIS_Without_ISAPI_Extentsion_2
------------------------------------------------------------------------------------------------
IIS_With_ISAPI_Extentsion_2
لعل وظيفة ISAPI Extension تكون قد اتضحت الآن فهو من أكسب IIS القدرة على التعامل مع ملفات ASP.NET والوافد الجديد علينا في الشكل الثاني هو aspnet_wp وهو عبارة عن المحرك الرئيسي لتشغيل ASP.NET فكل ما يفعله aspnet_isapi بعد استلامه أمر تشغيل صفحة معينة أن يناول هذا الأمر إلي العملية المسماة ASP.NET Worker Process (aspnet_wp ) بحيث تتولى هي كل ما يلزم فعله حتى يتم خدمة هذا الطلب وسنتعرض لها بالتفصيل في المقالة القادمة إن شاء الله لأنها هي الغرفة الثانية التي تدخلها أي صفحة ASP.NET
أما عن "ما هي الخطوات التي يتبعها IIS لمعالجة طلبات تشغيل الصفحات المختلفة ؟" فإجابته كالتالي :
1- عن طريق HTTP Request يحدد IIS امتداد الصفحة المطلوبة سواء كان aspx , asp , html ويحدد أيضاً اسم الموقع الموجود به هذه الصفحة
2- يُعلم IIS جميع ال ISAPI Filters الملحقة به بوصول HTTP Request جديد ويمرر هذا الطلب على جميع المرشحات ISAPI Filters
3- يذهب IIS إلي ScriptMaps خاصة بالموقع المطلوب ويعرف من هذه الخرائط ال ISAPI Extension المناسب لتشغيل هذا الامتداد داخل هذا الموقع
4- يوجه IIS طلباً مباشراً إلي ISAPI Extension المستهدف بتشغيل الصفحة المرادة عن طريق أمر مثل هذا Http://Server_Name/MyISAPIExtension.dll?TargetURL
5- بعد استقبال نتيجة تشغيل الصفحة من ال ISAPI Extension يُعلم IIS جميع ال ISAPI Filters بأن هناك HTTP Response على وشك الإرسال إلي المستخدم ويمرره عليهم جميعاً
6- يرسل IIS نتيجة تشغيل الصفحة في HTTP Response إلي المستخدم
ولعل هناك تساؤل عن كلمتين جديدتين وهما ISAPI Filters و ScriptMaps وكل واحدة من منهما هي إجابة للسؤالين الثالث والرابع ، لذا لنستعرض كل سؤال
فالسؤال الثالث كان "هل يستطيع IIS حجب بعض الصفحات أو الملفات عن المستخدم حتى وإن كانت موجودة عنده  ؟ وهل يمكنني أن أضبطه بحيث يحجب ملفات خاص بي لا أرغب في أن يطلع عليها المستخدم ؟"
فإجابة هذا السؤال هي نعم يستطيع IIS حجب ما يشاء من صفحات وملفات عن مستخدم بعينه أو حتى كل المستخدمين وذلك عن طريق ISAPI Filters فكما سبق توضيحه فإن أي HTTP Request & HTTP Response  داخل أو خارج يمر على جميع ال HTTP Filters الملحقة ب IIS وإن قرر أحد تلك المرشحات أن يحجب النتيجة عن المستخدم فلن يتم إرسال أي نتيجة إليه ولا يمرر IIS طلب المستخدم دفعة واحدة على كل المرشحات بل يمرر الطلب على مرشح تلو الآخر على حسب الأولوية المسجل بها هذا المرشح وإن تساووا في في الأولوية فأنه يمرر على  على حسب ترتيب تسجيل هذا المرشح داخل IIS  وإن كان هناك حاجة لحجب محتويات معينة عن المستخدمين يمكن بسهولة أن نطور ISAPI Filter خاص بنا يتولى ترشيح الطلبات قبل وصولها إلي موقعنا ويمكن إضافة وحذف وتعديل ترتيب التسجيل لأي ISAPI Filter عن طريق هذه الشاشة 
ISAPI_Filters_2
والتي يمكن الحصول عليها بإتباع المسار التالي
Control Panel >Administrative Tools > Internet Information Services > [Server Name] > Default Websites > Mouse Right Click > Properties > ISAPI Filters Tab
[Server Name] هو اسم الحاسوب المركب عليه IIS
وهذه المرشحات لا تستطيع تشغيل أي صفحة بل كل حدودها في حجب الطلبات أو إعادة كتابة عنوان الصفحة سواء القادم من المستخدم أو المرسل إليه ويمكن التوضيح بالمثالين التاليين
*** عنوان قادم من المستخدم مكتوب فيه HTTP://www.MySite.com/MyPage.aspx/UserName/Ahmed يمكن للمرشحات أن تعيد كتابة العنوان بالشكل التالي
HTTP://www.MySite.com/MyPage.aspx?UserName=Ahmed وبالتالي سيأخذ IIS هذا العنوان الجديد ويناوله إلي ال ISAPI Extension المناسب لمعالجة هذا العنوان
*** المثال الآخر هو في حالة إرسال عنوان صفحة في HTTP Response فالطبيعي أن يكون العنوان المرسل إلي المستخدم كالتالي HTTP://www.MySite.com/YourPage.aspx وقد نحتاج إن لا نعلم المستخدم بالتقنية المستخدمة في تطوير الموقع فيمكننا عن طريق ISAPI Filter أن نعيد كتابة العنوان قبل إرساله إلي المستخدم ليصبح HTTP://www.MySite.com
ويمكن تلخيص وظيفة ISAPI Filters في هذ الشكل
IIS_Without_ISAPI_Extentsion_And_Filters_2
ننتقل الآن لتوضيح ال ScriptMaps وفي نفس الوقت الإجابة على السؤال الرابع والأخير والذي كان  "كيف سيتصرف IIS إذا تعرف على امتداد صفحة وكان .aspx وعرف أنها ستعمل على ASP.NET وكان هناك نسختين مركبتين منها وهما ASP.NET 1.1 & ASP.NET "
قبل أن يوجه IIS طلب المستخدم للتشغيل عليه أن يقرأ أولاً ال ScriptMaps الخاصة بالموقع الذي تعمل بداخله الصفحة المرادة لأن كل موقع له ScriptMaps توضح امتدادات الملفات المدعمة من قبله وال ISAPI Extension المناسب لتشغيل كل امتداد لذا فلو كان هناك موقعين يعملان ب ASP.NETولكن لكل موقع إصدارة مختلفة من إصدارات ال ASP.NET فهذا يعني أن لكل موقع ScriptMaps مختلفة عن الآخر وهذا ما سيمنع تضارب تشغيل الصفحات بين الموقعين وعملية تسجيل هذه البيانات في ال ScriptMaps تسمى Script Mapping أو Application Mapping أيهما صحيح ويمكنك الإطلاع على ScriptsMaps الخاصة بكل موقع عن طريق هذه الشاشة 
Application_Mapping_2
والتي يمكن الحصول عليها بإتباع المسار التالي
Control Panel >Administrative Tools > Internet Information Services > [Server Name] > Default Websites > [Any Web Site] > Mouse Right Click > Properties > Virtual Directory Tab > Configuration Button
أما عن ماذا يحدث بعد أن يوجه IIS أمر تشغيل مباشر إلي  aspnet_isapi Extension وكيف يناوله aspnet_isapi إلي aspnet_wp.exe وماذا يحدث داخل aspnet_wp فهذا ما سنتعرف عليه في المقالة القادمة إن شاء الله "داخل غرفة aspnet_wp"

No comments:

Post a Comment