تعرف على ASP.Net , الجزء الثالث:HttpContext,HttpApplication

تنوية :

عن التأخير:

عفواً , تأخرت فى طرح الجزء الثالث, وذلك لإنشغالى فى إنهاء ترجمة كتاب Querying Microsoft SQL Server 2000 with  Transact-SQL   والحمد لله أنهيته , ودخل الكتاب أول مراجعة . وإن شاء الله يكون بين أيديكم قريباً , فلا تذهبوا بعيداً.

عن أجزاء السلسلة :-

تعرف على ASP.Net , الجزء الأول : ما وراء المشهد

تعرف على ASP.Net,الجزء الثانى:ASP.Net Patterns

وأترككم مع الجزء الثالث

HttpContext and HttpApplication

مقدمة :

كما رأينا أن HttpRequest يقوم برحلة لإحضار HttpResponse , ففى أثناء هذة الرحلة يتم إنشاء Objects (تعريف آخر : Instances ) من مجموعةClasses . والذى يقوم بإنشائها هو HttpRuntime . والهدف من ذلك الإستعانة بهم على إجراء بعض العمليات منها العام ومنها الخاص . والعام منها نجده متمثلاً فى التطبيق” , فنحن نحتاج إلى إدارة التطبيق ككل , فمن سيخبرنا عن حالة التطبيق ومن سيخبرنا بمعلومات عن المستخدم والخادم ومن سيحدد الصلاحيات وكذلك هوية المستخدم وامور أخرى . فيمكن أن نقول أن إدارة التطبيق هى الأساس فى هذة العملية ,حتى انه يتولى إدارة أمور تخص الصفحة, بل إنه الذى يعطى الأمر ببدء تنفيذ الصفحة .والخاص يتمثل فى طلب صفحة ما ,فلا شك ان الصفحة الواحدة تختلف مع نظريتها فى أمور . فكل صفحة يتم معالجتها بـController (يمكن أن نسميه هنا HttpHandler ) مختلف. ولذلك وجب وجود Objects فى عالم ملئ بالـ Objects ولا يعترف بغيرها , إبتسم ,أنت فى عالم Object Oriented . فيدور حديثنا اليوم حول إثنين من هذة الـ Objects وهما : HttpApplication , HttpContext . وهما الّذين يتم إنشائهما بواسطة HttpRuntime .

HttpContext

قد علمنا انه فى رحلة طلب الصفحة من المستخدم إلى الخادم , يتم إنشاءInstance من Class تسمى HttpContext أثناء وقت التشغيل , يأخذ الـ Instance الطلب القادم HttpRequest كمدخلات , ليتم تجميع المعلومات الخاصة بهذا الطلب ووضعها فى هذا الـInstance . مثال على هذة المعلومات: HttpResponse , أو HttpRequest , أو التفاعل مع HttpServerUtility , وكذلك يمكنك التفاعل مع Session و Trace و Cache .وغيرهم الكثير مما يمكن أن تكتشفه بنفسك , ويكون ذلك بتصفح الـ HttpContext , كما ترى بالصورة الموضحة أمامك :

كما ننوه ان هذا الـ Instance نجده هنا فى تللك الخاصية Current , التى قد رأيتها بالصورة السابقة,فهى خاصية Static “تعرف فى Vb.net بإسم Shared ”, متاحة على المستوى العام ,ليراها كل التطبيق وتستطيع الوصول إليها من أى مكان .

وننوه أيضاً أن هناك خاصية اخرى داخل HttpApplication تحمل فى طياتها هذا الـ Instance , وأيضاً نجد انه هناك داخل HttpContext

ما نستطيع ان نشير إلى Instance المأخوذ من HttpApplication الحالى . ومثال على ذلك ما ترى :

 

هناك تبادل وتداخل وهذا يسمح لك بالتعامل المرن عند الحاجة إلى HttpContext أو HttpApplication . وهذا سنراه إن شاء الله عند التعامل مع HttpModules .

وبالفعل قدمت حلول لمشاكل كثيرة .

HttpApplication

ومن ضمن هذة الـ Objects يتم إنشاء Instance من HttpApplication تلقائياً بواسطة ASP. Net Runtime , ليقوم هذا الـ Instance بإدارة التطبيق ككل , واتاحت لك ASP. Net ان تتعامل مع هذا الـ Instance من خلال توفير وسائل مرنة , يمكنك من خلال هذة الوسائل أن تقوم بضبط إعدادات عامة لكامل التطبيق, أو قد تحتاج أن تجرى عملية ما أثناء تنفيذ حدث من أحداث التطبيق , فنحن نتحدث عن ملف global.asax وكذلك HttpModules . نعم هذة هى الوسائل المتاحة .Global.asax , هذا الملف ما هو إلا class تقوم بعمل وراثة للــ HttpApplication . وهو المكان المخصص للإحتفاظ بالإعدادت العامة لكامل التطبيق وكذلك أحداث التطبيق أو ما نطلق عليه دورة حياة التطبيق كما ذكرنا , و المكان البديل أو إن شئت قم بتسميته المساعد لكتابة هذة الأحداث والإعدات العامة هو HttpModule .

فما هو HttpApplication ؟

نقول وبالله التوفيق , إنها Class تم إنشائها لتتولى مسئولية إدارة وتنفيذ الطلب الحالى للصفحة من بدايته إلى نهايته . وتضم هذة الـ Class مجموعة من الخصائص (Properties ) والأحداث (Events) .

فالخصائص تجدها كالتالى :

Application

وما هى إلا Instance من HttpApplicationState .,وجاءت لتتولى الحالة العامة للتطبيق , وما هى إلا قيم معرفه بأسماء ,يقوم عملها على طريقة Dictionary , أى تاخذ Key&Value. ,

Response

وهى Instance من HttpResponse , ليقوم بتولى إدارة عمليات المخرجات إلى جهاز المستخدم .

Request

وهى Instance من HttpRequest , ويمثل الطلب الحالى للصفحة .

User

وهو من نوع IPrincipal ,وهدفها الإحتفاظ بمعلومات عن هوية المستخدم .

Context

وهى Instance من HttpContext , وتحتوى عن تجميع المعلومات عن الـ Request .

Modules

وهى Instance من HttpModuleCollection , وبها يتم إخطار التطبيق بكافة الـ Modules الموجودة بالتطبيق ليعطى الأمر بتنفيذها.

 Server

وهى Instance من HttpServerUtility , وبها نجد ما يخص عمليات العمل مع الخادم .

Session

وهى Instance من HttpSessionState ,وتحتفظ ببيانات تخص المستخدم الواحد (الحالى) .

الأحداث :

لا اود أن أعدها فى نقاط , و لكن أميل إلى أن أروى لك قصة مرورها وإرتباطها ببعضها ,واحدة تلو الأخرى , فهيا والله المستعان .

القصة :

تبدأ أحداث التطبيق من أول حدث يتم إعطائه الإشارة بالبدء ,وهو الحدث الذى يتم تنفيذه مرة واحدة على الإطلاق , إلى أن يسقط التطبيق , أو نقوم بإيقاف برنامج الخادم (IIS)وإعادة تشغيله, نحن نتكلم عن حدث Application_Start , وبه يمكن ان نقوم بتعريف الإعدادات التى نريد ضبطها مع بداية تشغيل التطبيق لأول مرة . يلى هذا الحدث , بل وندخل بعد ذلك فى مرحلة التكرار مع كل طلب للصفحة .والحدث الذى يضع أيدينا على هذة المرحلة هو Application_BeginRequest , هنا بداية رحلة الطلب للصفحة , وهنا قد وصل الطلب من المستخدم , ألا يحتاج إلى تحديد هويته ؟ , بلى , يحتاج ,فيصدر الأمر بتنفيذ الحدث AuthenticateRequest , ولعلك تعلم ان هناك ثلاث اوضاع لتحديد الهوية وهما “Forms ,Windows ,Passport ” فيوجد لكل واحد منهم HttpModule يتم تنفيذه للكشف عن هوية المستخدم , وبالأخص فى هذا الحدث . ثم يصدر الأمر بإنه قد تم التحقق من الهوية , لياتى دور الحدث PostAuthenticateRequest فى التنفيذ , ليأتى دور التحقق من صلاحيات هذا المستخدم , وما هى الصفحات التى يمكن أن يتصفحها , فلابد من إصدار الأمر بتنفيذ الحدث AuthorizeRequest , وهنا يتم تنفيذ إثنين من الـModules وهما “FileAuthorization , UrlAthurization” . ليتم الإنتهاء من ذلك وياتى دور الحدث PostAuthorizeRequest , إلى الإن تم تحديد هوية المستخدم وتحديد صلاحياته , وفى إتجاهه إلى أن يصل إلى الصفحة , ولكن أليس من المنطق أن يبحث فى الـCache , لعله يجد الصفحة ليختصر الطريق , حقاً , لابد من الكشف أولاً, فياتى دور حدث ResolveRequestCache ,فاذا وجدت الصفحة فى الـ Cache , يتم قطع الطريق على الرحلة وياخذ حدث EndRequest فى التنفيذ وهو آخر حدث فى هذة الرحلة .وتنتهى الرحلة . والإحتمال الأخر ان الصفحة لا توجد فى الـ Cache . وعندها تستمر الرحلة , وهنا لابد من العمل على إنشاء الصفحة ليتم عرضها للمستخدم ,فلابد من إصدار الأمر لمن يقوم بإنشاء الصفحة وهو HttpHandler , ويعلن عن هذة المهمة حدث PostResolveRequestCache . ليتم تحديد الـ Handler للتنفيذ ليعلن حدث MapRequestHandler هذا الأمر , ولكن لم يتم التنفيذ بعد ,فالتنفيذ هنا يعنى إخراج عناصر الـ HTML للمستخدم , ولكن بقى حدث PostMapRequestHandler المسئول عن إعلان نجاح إنشاء Instance من الـHandler الذى تم تحديده , ليأتى دور الكشف عن حالة التطبيق كمثال, ApplicationState , SessionState , لعل الصفحة التى تم إنشاء Instance منها قد تحتاج احد هذة الحالات , ويعلن عن هذا العمل الحدث AcquireRequestState , ويأتى الأمر بتنفيذ الحدث PostAcquireRequestState بإعلان إتمام الحصول على حالة التطبيق وحفظها , ليأتى حدث ماقبل تنفيذ Handler وهو PreRequestHandlerExecute يعلن هذا الحدث عن أنه تم إنتاج مخرجات المستخدم , ليتم بعدها معالجة الـطلب بالمخرجات ليصدر حدث RequestHandlerExecute , ويأخذ الحدث PostRequestHandlerExecute مهمة إعلان الإنتهاء من معالجة الطلب الحالى ,وهنا ننوه أنه لو كان الطلب الحالى لصفحة aspx , فإلى هذا الحد قد تمت دورة حياة الصفحة ويتم استكمال الرحلة ,ويأتى الحدث ReleaseRequestState ليعلن عن تحديث حالة التطبيق ,ومن ثم حفظها عند الحدث PostReleaseRequestState .ثم يأتى حدث UpdateRequestCache ليخبرنا أنه تم الكشف عن إذا ما كانت الصفحة قد تم ضبطها لتحفظ فى الـ Cache أم لا .فإذا كانت ,فتحفظ فى الـ Cache ويخبرنا PostUpdateRequestCache بذلك . ويأتى الدور لتسجيل نتائج الـRequest ويعلن عن ذلك حدث LogRequest , ثم يتم الإعلان عن إتمام التسجيل عند حدث PostLogReuest . ليأتى لنا بعد طول إنتظار الحدث الأخير فى هذة الرحلة وهنا نعطى المستخدم المخرجات الناتجة عن طلبه ,بعد هذا الحدث وهو EndRequest .

 وهناك بعض الأحداث التى لا تحدث بشكل دورى , ولكن تحدث حسب الحاجة لها , كامثال حدث Error عند وجود خطأ لم تتم معالجتة. وكذلك حدثEnd عند حدوث خلل فى التطبيق ليتم إغلاقه . وغيرهم .

 ما أطولها من قصة ومن رحلة , ولكن هى مفيده , فأنت ترى ما وراء المشهد . ورؤية ما وراء المشهد , تورث فهماً عميقاً للأمور,وسترى الكثير من الأمور الممتعة عند إستكشافك لـHttpApplication عبر أداة (http://www.reflector.net) .

  ومزيد من التوضيح يقدمه لنا الشكل التالى , ليبين تداخل أحداث الصفحة ضمن أحداث التطبيق وكذلك يظهر ترتيب الأحداث حسب أولوية التنفيذ :-

وفيما يخص أحداث الصفحة , إن شاء الله , سنرى إن هناك احداث أخرى لم يتم إدراجها فيما سبق , ولكن عليك أن تعرف ان هناك أحداث تزيد وتنقص حسب ,نوع الطلب الحالى . وستتعرف على دورة حياة الصفحة بالتفصيل , فى درس قادم .والله الموفق.

أمثلة على إستخدامات HttpApplication

توضيح :

قد نحتاج إلى بعض الأمثلة , فى أمر ما , حتى تتضح كامل الفكرة , وأرى أن أسس شرح أمر من الأمور ,أن تضع ضمن الشرح مثال . والله المستعان. وكنا قد إتفقنا اننا لن ندرج بالامثلة أكواد ولكن سنقدم مزيداً من التفصيل . إن شاء الله .

 مثال, حساب المدة المستقطعة لإجراء بحث ما :

قد نحتاج ان نقوم بحساب المدة التى يمكن أن تأخذها عملية البحث , وليكن داخل ملف ما ,سواء كان قاعدة بيانات او ملف XML او حتى ملف Text . ولعلك قد رأيت من خلال البحث فى محرك البحث الشهر Google , فهو يعطيك المدة التى إستغرقها البحث .

 ما الفكرة التى وراء هذا الأمر ؟

الفكرة أننا سنقوم بمعرفة الوقت الذى بدأ عنده البحث وكذلك الوقت الذى إنتهى عنده , ونقوم بالطرح , ليعطينا المدة بين الوقتين .

 أبعاد التنفيذ :

من خلال الرحلة التى يأخذها الطلب ,فإننا قد عرفنا ان اول حدث ينفذ هو Application_BeginRequest , إذاً , يمكننا معرفة وقت البداية فى هذا الحدث . وأيضاً أصبح لدينا علماً بإن آخر حدث يتم تنفذه هو Application_EndRequest , وهو المكان الأمثل ,لمعرفة وقت إنهاء المهمة .وفى هذا الحدث أصبح لدينا بداية ونهاية , وعندها يمكننا أن نقوم بطرح الوقتين من بعضهما.

 فى الدرس القادم إن شاء الله سنتعرف على Global.asax, HttpModule,HttpHandler .

أضف تعليقاً

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

WordPress.com Logo

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   / تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   / تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   / تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   / تغيير )

Connecting to %s