8.2 مسار ASP.NET ودورة حياة التطبيق
يقدم القسم 8.1 بنية نظام IIS والعملية الشاملة لمعالجة طلب HTTP. ومن خلاله، يمكننا معرفة أن كل موقع ويب ASP.NET يتوافق مع تطبيق ويب يمكنه الاستجابة لطلبات HTTP وتزويد المستخدمين بالمعلومات المطلوبة. إذًا، كيف يستجيب تطبيق ASP.NET لطلبات HTTP بالضبط؟ ما هي إجراءات المعالجة المحددة المضمنة؟ يتضمن ذلك دورة حياة تطبيقات ASP.NET.
8.2.1 دورة حياة تطبيق ASP.NET*
يأخذ هذا القسم IIS 6 كمثال لتقديم عملية معالجة طلبات HTTP خطوة بخطوة بواسطة تطبيقات ASP.NET. تحتوي عملية IIS 7 على بعض التغييرات الطفيفة مقارنة بـ IIS 6، ولكنها متسقة بشكل عام.
1 يصدر المتصفح طلب HTTP للوصول إلى صفحة ويب ASP.NET.
افترض أن هذا الطلب هو الطلب الأول لتطبيق ASP.NET الذي تنتمي إليه صفحة الويب هذه.
عندما يصل هذا الطلب إلى خادم الويب، يكون HTTP.SYS مسؤولاً عن استلامه وفقًا لعنوان URL لهذا الطلب، ويقوم HTTP.SYS بتمريره إلى تجمع التطبيقات المطابق لتطبيق ASP.NET هذا، وتجمع التطبيقات الذي يعمل في هذا التطبيق. تكون العمليات العاملة في المجمع مسؤولة عن معالجة الطلبات[1].
بعد أن تتلقى العملية المنفذة هذا الطلب، تقوم بتحميل ملحق ISAPI "aspnet_isapi.dll" المخصص لمعالجة صفحات ASP.NET وتمرير طلب HTTP إليه.
بعد قيام العملية المنفذة بتحميل aspnet_isapi.dll، يكون aspnet_isapi.dll مسؤولاً عن تحميل بيئة التشغيل لتطبيق ASP.NET - CLR [2].
تعمل العملية المنفذة في بيئة غير مُدارة (بالإشارة إلى نظام التشغيل Windows نفسه)، بينما تعمل الكائنات الموجودة في .NET في بيئة مُدارة (بالإشارة إلى CLR). يعمل aspnet_isapi.dll كجسر للتواصل بين الاثنين تتم إعادة توجيه الطلبات المستلمة (من بيئة غير مُدارة) إلى كائن .NET المقابل (في بيئة مُدارة) للمعالجة.
2 قم بإنشاء كائن ApplicationManager ومجال التطبيق
بعد تحميل CLR، تكون فئة ApplicationManager مسؤولة عن إنشاء مجال التطبيق. يعمل كل تطبيق ASP.NET في مجال التطبيق الخاص به ويتم تعريفه بواسطة معرف تطبيق فريد.
يتوافق كل مجال تطبيق مع مثيل لفئة ApplicationManager، المسؤولة عن إدارة تطبيقات ASP.NET التي تعمل في المجال (مثل بدء تطبيق ASP.NET وإيقافه، وإنشاء كائنات في تطبيق ASP.NET محدد، وما إلى ذلك) .
3 قم بإنشاء كائن HostingEnvironment
عند إنشاء مجال تطبيق لتطبيق ASP.NET، يتم إنشاء كائن HostingEnvironment، والذي يوفر بعض المعلومات الإدارية لتطبيق ASP.NET (مثل هوية تطبيق ASP.NET والدليل الظاهري والدليل الفعلي المطابق)، ويوفر بعض الوظائف الإضافية (مثل تسجيل كائن في مجال التطبيق، وانتحال شخصية مستخدم معين، وما إلى ذلك).
4 قم بإنشاء كائنات ASP.NET Core لكل طلب
عندما يتم إنشاء مجال التطبيق، يتم إنشاء كائن ISAPIRuntime ويتم استدعاء أسلوب ProcessRequest() الخاص به تلقائيًا. في هذه الطريقة، يقوم كائن ISAPIRuntime بإنشاء كائن HttpWorkerRequest بناءً على طلب HTTP الوارد، حيث يقوم هذا الكائن بتغليف المعلومات المتنوعة لطلب HTTP بطريقة موجهة للكائنات (أي أن معلومات طلب HTTP الأصلية يتم تغليفها ككائن HttpWorkerRequest). بعد ذلك، قم باستدعاء أسلوب StartProcessing() لكائن ISAPIRuntime لبدء عملية معالجة طلب HTTP بالكامل (هذا هو "خط أنابيب HTTP: خط أنابيب HTTP" في بداية عملية المعالجة هذه، يتم إنشاء كائن نوع HttpRuntime، ويتم إنشاء ملف يتم استخدام كائن HttpWorkerRequest الذي تم إنشاؤه مسبقًا حيث يتم تمرير معلمات الطريقة إلى طريقة ProcessRequest() لكائن HttpRuntime هذا.
يتم تنفيذ بعض الأعمال المهمة جدًا في طريقة ProcessRequest() لفئة HttpRuntime، ومن بينها الأعمال الأكثر ارتباطًا بمهندسي برمجيات الويب هي:
تقوم طريقة ProcessRequest() لفئة HttpRuntime بإنشاء كائن HttpContext بناءً على معلومات طلب HTTP المتوفرة في كائن HttpWorkerRequest.
يعد كائن HttpContext مهمًا لأن هذا الكائن يحتوي على كائنين آخرين شائعين جدًا في برمجة ASP.NET: HttpResponse وHttpRequest.
تأتي المعلومات الموجودة في كائن HttpRequest من طلب HTTP الأصلي، على سبيل المثال، تمثل سمة URL الخاصة به عنوان URL في معلومات طلب HTTP الأصلية.
يحتوي كائن HttpResponse على بعض الخصائص والأساليب لإنشاء المعلومات المراد إرجاعها إلى المتصفح.
توفر فئة الصفحة خصائص مقابلة للإشارة إلى هذين الكائنين، بحيث يمكنك استخدام خصائص "Requset" و"Response" مباشرةً للوصول إلى هذين الكائنين في صفحة ويب ASP.NET. على سبيل المثال:
الفئة العامة الجزئية _Default: System.Web.UI.Page
{
Page_Load باطلة محمية (مرسل الكائن، EventArgs e)
{
الاستجابة .Write(طلب .Url);
}
}
تشير خاصية السياق لفئة الصفحة إلى كائن HttpContext، لذلك يمكن أيضًا إعادة كتابة الكود أعلاه بالشكل التالي:
الفئة العامة الجزئية _Default: System.Web.UI.Page
{
Page_Load باطلة محمية (مرسل الكائن، EventArgs e)
{
this.Context.Response .Write(this.Context.Request .Url);
}
}
فيما يتعلق بالكائنات الثلاثة HttpContext وHttpResponse وHttpRequest، يجب عليك إتقان النقاط التالية:
l يحتوي كائن HttpContext على كائنين، HttpResponse وHttpRequest. يمكنك الحصول على المعلومات المتعلقة بطلب HTTP من كائن HttpRequest، ويمكن تحقيق المحتوى الذي سيتم إخراجه إلى المتصفح عن طريق استدعاء طريقة HttpResponse.
l لكل طلب HTTP، يقوم ASP.NET بإنشاء كائن HttpContext، والذي يمكن الوصول إليه أثناء معالجة HTTP بأكملها.
5 قم بتخصيص كائن HttpApplication للتعامل مع الطلب
بالإضافة إلى إنشاء كائن HttpContext، تكمل طريقة ProcessRequest() لفئة HttpRuntime أيضًا مهمة أخرى مهمة جدًا - وهي التقدم بطلب لتخصيص كائن HttpApplication لمثيل فئة HttpApplicationFactory [3] لإدارة كل خطوة في معالجة طلب HTTP بالكامل نوع من الحدث.
كائن HttpApplicationFactory مسؤول عن إدارة تجمع كائنات HttpApplication [4] عندما يأتي طلب HTTP، إذا كان هناك كائن HttpApplication متاح في التجمع، فسيتم تخصيص هذا الكائن مباشرة لمعالجة طلب HTTP مخلوق.
6 يبدأ كائن HttpApplication خط أنابيب HTTP
كائن HttpApplication مسؤول عن تجميع "خط أنابيب معالجة طلب HTTP (خط أنابيب HTTP)" بالكامل. يمكن مقارنة "خط أنابيب معالجة طلب HTTP" بـ "خط أنابيب الإنتاج" في المصنع الحديث. كائن HttpContext الذي تم إنشاؤه في الخطوة السابقة هو "المنتج" الذي سيتم معالجته بواسطة خط أنابيب الإنتاج هذا. عندما يتدفق عبر أجزاء مختلفة من "خط أنابيب الإنتاج"، ستتم معالجته ومعالجته على وجه التحديد.
كيف تتم هذه "العمليات والعلاجات" المحددة؟
ببساطة، عندما يمر كائن HttpContext عبر أجزاء مختلفة من "خط أنابيب الإنتاج"، فإن كائن HttpApplication سيطلق سلسلة من الأحداث [5]. مكون محدد - يمكن لوحدة HTTP (وحدة HTTP) الاستجابة لهذه الأحداث في رمز استجابة الحدث هذا، يمكن معالجة كائن HttpContext بهذا المعنى، يمكن اعتبار وحدة HTTP بمثابة "خط أنابيب الإنتاج". "العاملين في. وحدة HTTP هي في الواقع "مرشح ISAPI" الذي تم تقديمه مسبقًا.
يتم إنشاء كائن وحدة HTTP في طريقة InitModules () [6] لكائن HttpApplication. نكتب بشكل عام التعليمات البرمجية في طريقة Init () [7] لكائن وحدة HTTP حتى يتمكن من الاستجابة لأحداث محددة يتم تشغيلها بواسطة HttpApplication. هدف.
يوفر ASP.NET بعض وحدات HTTP المحددة مسبقًا للاستجابة لأحداث معينة، ويمكن لمهندسي برمجيات الويب أيضًا كتابة وحدات HTTP الخاصة بهم وإدراجها في "خط أنابيب معالجة طلبات HTTP" [8].
في منتصف المسار (بعد معالجة الأحداث ذات الصلة)، يتم استلام كائن HttpContext بواسطة كائن الصفحة النهائي (ولهذا السبب يمكن الوصول إلى كائن HttpContext في صفحة ASP.NET من خلال خاصية السياق المحددة بواسطة فئة الصفحة).
سيتم تحويل كل صفحة ASP.NET يتم الوصول إليها إلى "فئة صفحة مشتقة من فئة الصفحة".
ملاحظة: تقوم فئة الصفحة بتنفيذ واجهة IHttpHandler، التي تحدد أسلوب ProcessRequest().
بعد إنشاء فئة صفحة ASP.NET، يتم تجميعها تلقائيًا في تجميع، ثم يتم استدعاء أسلوب ProcessRequest() الخاص بها تلقائيًا (نظرًا لأن فئة الصفحة تنفذ واجهة IHttpHandler، يجب أن تحتوي على هذه الطريقة). في هذه الطريقة يتم تنفيذ الكود الذي كتبه مهندس برمجيات الويب (إن وجد). يتم تنفيذ نتيجة تنفيذ أسلوب ProcessRequest() مرة أخرى بواسطة كائن HttpContext، ويتم نقل التحكم مرة أخرى إلى "خط أنابيب معالجة طلب HTTP"، ويستمر كائن HttpApplication في إطلاق الأحداث اللاحقة. في الوقت الحالي، إذا كانت هناك وحدات HTTP محددة تستجيب لهذه الأحداث، فسيتم استدعاؤها تلقائيًا.
يقوم كائن HttpContext بإحضار نتيجة المعالجة النهائية إلى نهاية "خط أنابيب معالجة طلب HTTP"، ويتم إخراج معلوماته وإرسالها إلى العملية المنفذة مرة أخرى باستخدام aspnet_isapi.dll كجسر. تقوم العملية المنفذة بعد ذلك بنقل نتائج معالجة طلب HTTP إلى HTTP.SYS، وهو المسؤول عن إرجاع النتائج إلى المتصفح.
وفقًا للمقدمة السابقة، يمكن تقسيم خط أنابيب HTTP بأكمله إلى ثلاثة أقسام: مرحلة المعالجة المسبقة à مرحلة المعالجة à مرحلة ما بعد المعالجة (الشكل 8 ‑14).
الشكل 8 ‑ 14 ثلاث مراحل لخط أنابيب HTTP
كما هو موضح في الشكل 8 ‑14، تتم مشاركة مراحل المعالجة المسبقة والمعالجة اللاحقة لخط أنابيب HTTP بشكل أساسي بواسطة وحدات HTTP متعددة ويتم تشغيلها بواسطة الأحداث مراجعة كائن HttpContext.
يتم إكمال معالجة طلبات HTTP في النهاية في "مرحلة المعالجة" بواسطة كائن يقوم بتنفيذ واجهة IHttpHandler. تقوم كل فئة صفحة تم إنشاؤها بواسطة صفحات ويب ASP.NET بتنفيذ هذه الواجهة. كائن PageHandlerFactory [9] مسؤول عن إنشاء كائن معالجة طلب HTTP مناسب.
يمكن ملاحظة أن الكائن الذي ينفذ واجهة IHttpHandler هو المسؤول عن معالجة طلبات HTTP، ولهذا السبب يطلق عليه "المعالج (المعالج)".
بالإضافة إلى صفحات الويب ASP.NET الأكثر شيوعًا، يمكن لمهندسي برامج الويب أيضًا إنشاء كائناتهم الخاصة التي تنفذ واجهة IHttpHandler وإدراجها في مسار HTTP للتعامل مع طلبات HTTP.
عند معالجة طلب HTTP، يتم تحرير الكائنات ذات الصلة، ولكن يظل مجال التطبيق الذي تم إنشاؤه وHttpApplication والكائنات الأخرى موجودًا للاستجابة لطلب HTTP التالي.
7 ملخص دورة حياة تطبيق ASP.NET
يقدم هذا القسم دورة حياة تطبيقات ASP.NET، وهي عملية معقدة للغاية وقد يكون من الأسهل فهمها من خلال القياس الشائع التالي:
l "خط أنابيب معالجة طلبات HTTP" هو "خط تجميع الإنتاج" في مصنع حديث، وكائن HttpContext هو المنتج الذي سيتم معالجته على خط التجميع هذا.
l يعد كائن HttpHandler (معالج HTTP) جوهر "خط إنتاج المنتج" بأكمله، وهو المسؤول عن تجميع المنتج في الشكل.
l HttpModule (وحدة HTTP) تعادل العمال المساعدين في "خط الإنتاج". يقومون بإجراء "المعالجة المسبقة" (التحضير لتجميع المنتج) و"المعالجة اللاحقة" (التحضير لتسليم المنتج، مثل وضع العلامات) على المنتج (كائن HttpContext) ).
l كائن HttpApplication هو "القائد" لـ "خط الإنتاج" بأكمله، وهو مسؤول عن تخصيص العمال لـ "خط الإنتاج" (تهيئة وتحميل جميع وحدات HttpModules المسجلة)، ثم تشغيل سلسلة من الأحداث (تسمى "ASP. أحداث تطبيق NET" ")، يكون HttpModule محددًا مسؤولاً عن الاستجابة لأحداث معينة.
-------------------------------------------------- ----------------------------------
[1] في حالة عدم وجود العملية المنفذة، سيقوم برنامج مراقبة IIS WAS بإنشاء عملية تنفيذية، وإلا سيتم إعادة استخدام العملية المنفذة الموجودة.
[2] في الوضع المتكامل لـ IIS 7، نظرًا لأن CLR تم تحميله مسبقًا، ليست هناك حاجة لهذه الخطوة.
[3] "مثيل الفئة" و"كائن الفئة" لهما نفس المعنى، وكلاهما يشير إلى كائنات تم إنشاؤها باستخدام الفئات كقوالب.
[4] تجمع الكائنات (Object Pool) هو أسلوب شائع لتنظيم الكائنات في أنظمة البرامج الموجهة للكائنات، ويمكن اعتباره حاوية كائنات. يحتوي تجمع الكائنات على كائنات متعددة تم إنشاؤها مسبقًا. عندما يحتاج العالم الخارجي إلى كائن ما، يمكنه مباشرة إخراج كائن جاهز من التجمع واستخدامه، وبالتالي تجنب فقدان الأداء الناجم عن إنشاء الكائن المتكرر.
[5] يحدد HttpApplication عددًا قليلًا من الأحداث للحصول على قائمة كاملة بالأحداث، يرجى الاطلاع على MSDN.
[6] سيتم استدعاء هذه الطريقة تلقائيًا عند الحصول على كائن HttpApplication.
[7] يجب على جميع وحدات HTTP تنفيذ واجهة IHttpModule، ويتم تعريف طريقة Init() بواسطة هذه الواجهة.
[8] يمكن إضافة وحدات HTTP المخصصة إلى تدفق معالجة طلب HTTP عن طريق إدراج محتوى محدد في Web.Config.
[9] هذا هو جوهر آخر في إطار عمل تكنولوجيا ASP.NET