أرشيف التصنيف: ASP.Net

ASP.Net controls , Components ,Configuration And More ………

تعرف على ASP.Net , الجزء الخامس:ASP.Net Compilation

ASP.Net Compilation

مقدمة

أهلاً بكم فى الجزء الخامس من هذة السلسلة , حيث ذكرنا فى الجزء الرابع كيف ان المستخدم يقوم بكتابة عنوان الموقع الذى يريده فى شريط عنوان المتصفح , والذى يقوم بدوره بإرسال طلب بهذا الموقع إلى الخادم , فيتلقى الخادم هذا الطلب على شكل عنوان URL , فيقوم بفحصه, ليحدد الملف المطلوب , ومن ثم تسليمه إلى الـ Handler المسئول عن معالجة هذا الملف . وما يجعلك واثقاً من أنه يوجد توافق ما بين الملفات والـHandlers المعدة لمعالجتها , هو , أن كل ملف أو قد نقول إمتداد ملف تم ربطه بمعالج خاص به من خلال ملفات الإعدادت , ونقصد ملف configuration , سواء كانت هذة الإعدادات تم تعريفها مسبقاً (مبنياً)داخل ASP.Net ,ونجدها فى ملف Machine.Config , او إعدادات , قمت انت كمطور بإعدادها , ونجدها فى ملف Web.config .إذاً , هناك ربط بين الصفحة والمعالج . وعلى هذا , يدور حديثنا اليوم إن شاء الله , حول بداية تحديد المعالج ومن ثم إجراء جولة عميقة والله المستعان داخل إنشاء Instance من المعالج , ولاشك أن هناك الكثير من أنواعها , ولكن سيدور حديثنا حول صفحات ASP.Net .

ملحوظة :-

يوجد ملف Machine.Config فى هذا المسار

WINDOWS\Microsoft.NET\Framework\[Version]\Config\

او يمكنك الوصول إلى هذا المسار برمجياً من خلال الكود التالى : HttpRuntime.MachineConfigurationDirectory;

المحتويات:-

كل شئ هنا هو Object .

صفحة ASPX وقت التشغيل

ASP.Net Execution Model ؟

ماهى Temporary ASP.Net Files ؟

ماهى ASP.Net Pre-Compilation ؟

كل شئ هنا هو Object .

حين نتحدث عن صفحة ASPX نجدها متمثلة ً فى أجزاء عدة , أكواد HTML ,CSS,JavaScript,C#/vb ,وبالطبع ادوات ASPX والتى تعتبر فى مظهرها مشابهة لأكواد HTML ومطابقة فى جوهرها إلى أكواد XML . وسنرى إن شاء الله حقيقة هذة الأودات بعد قليل . ولكن كما رأيت تتركب الصفحة من أكواد للغات وتنقيات مختلفة . فإذا قمنا بالتقسيم بناءاً على تبعية التنفيذ سواء كان لجهاز الخادم او لجهاز المستخدم ! كيف سيكون التقسيم ؟

سنجد ان HTML,CSS,JavaScript كلها تتبع جهاز المستخدم , وترسل كما هى إلى المتصفح , والتى يتولى ترجمتها سواء إلى عناصر رسومية تتشكل بها الصفحة والناتجة عن HTML , او تلك التى تعطى المزيد من التنسيقات الجذابة كألوان وحجم خط أو سمك او عرض او إرتفاع أو غير ذلك من التنسيقات الناتجة عن CSS , واخيراً ردود الفعل السريعة وربما البسيطة , على الرغم من أن كلمة بسيطة لا تواكب تحديثات اليوم التى أجريت علىJavaScript , تلك التحديثات التى نشأت وترعرعت حتى أصبحت تنال إعجاب الكثيرين وهى Jquery .

ملحوظة :-

JQuery ما هى إلا مكتبة أكواد تمت صنعها بإستخدام JavaScript لتقدم طريقة مبسطة للتعامل مع أكواد JavaScript وشعارها هو اكتب القليل وافعل الكثير ” , نعم , يمكنك كتابة كلمتين أو أكثر لتفعل الكثير من الأمور والتى فى السابق كنت تحتاج أن تكتب السطور لتنجز نفس المهمة .والذى زادها جمالاً وروعة هو تعاملها مع الخادم بطريقة سلسلة.وقد ورد ذكرها فى سلسلة درورس الإتصال بدوال Server-Side من خلال Client-Side .

يستقبل المتصفح هذة الأكواد فى شكل نصوص عادية , ليتولى معالجتها , كلاً على طريقته , وننوه على أن المتصفح لا يفهم غير اكواد HTML فقط كلغة عرض . فكيف بأكواد أدوات aspx والتى تعد أداوت Server ؟ ……. هذا ما ستعرفه بنهاية هذا الجزء إن شاء الله .

نأتى إلى دور الخادم فى هذة اللعبة , وهو الدور الأهم لاشك , حيث تظهر هنا ما هية صفحة ASPX وما السر وراء أدواتها .

أريدك أن تركز جيداً فيما سنقول , الصفحة ما هى إلا Object من Class وكذلك الأدوات , فكل أداة تحمل الخاصية runat يتم إنشاء Instance من الــClass التابع لها هذة الإداة . وحتى اكون أكثر وضوحاً سأضرب لك مثلاُ :-

أداة مثل أداة Button حين نريد منك ان تقوم بإنشاء واحدة منها, ماذا تفعل ؟ , سواء كان ردك إننى اقوم بكتابة كود الأداة بيدى أو كان إننى أقوم بسحب الأداة من شريط الأدوات واقوم بإلقائها على الصفحة ” ,سواء كان هذا او ذاك , فى الحقيقة أنت تقوم بإنشاء Instance من Class , أى أن , فعلك هذا مشابة لكتابة هذا السطر التالى :-  Button button1 = newButton . وهذا ما يقوم به الخادم أثناء وقت التنفيذ بدلاً منك . فإليك الحقيقة كاملة فى الفقرة التالية .

صفحة ASPX وقت التشغيل

تخيل أن لدينا صفحة تحت مسمى Default.aspx يقوم على خدمتها ملف يسمى Code-behind تحت إسم Default.aspx.cs , بها بعض الأدوات وليكن بها Button وlabel وأدوات اخرى . قام المستخدم بطلب هذة الصفحة من الخادم , فهل تعلم ما هى آلية التنفيذ . دعنا نأخذ الأمر فى المجمل العام ثم نتطرق إلى التفصيل :-

فى العام تكون الخطوات على النحو التالى :-

  • تمرر الصفحة إلى Parser يقوم بالتدقيق الإملائى أو النحوى للتحقق من ان الصفحة خالية من الأخطاء النحوية .

  • ثم تمرر إلى Compiler والذى يقوم بتحويلها إلى ملفDLL فى شكل ملف بلغة MSIL .

  • ثم يضع ملف DLL والذى يعد (MSIL Code) داخل Assembly Cache.

  • ليقوم الـRuntime بجلب هذا الـ DLL وتنفيذه وتكتمل العملية ويعطى المخرجات .

وهنا سؤال , هل هذا الأمر يحدث كل مرة نطلب فيها الصفحة ؟ ,الإجابة لا ,……… تحدث هذة العملية فى أول مرة يتم طلب الصفحة فيها فقط , وبعد ذلك لا يتم تكرار العملية , بل يذهب مباشرة ً إلى ملف DLL , المخزن فى الـ Cache , ويأتى بالصفحة المراد العمل معها . إلا إذا !!! …………… إلا إذا ماذا ؟………. إلا إذا حدث تغير فى الصفحة أو الكود الخاص بالصفحة , وهنا نقصد تركيبة الصفحة ,أى قام المبرمج بالتعديل فى الـ Source Code الخاص بالصفحة , فيذهب تلقائياً إلى إجراء العملية من بدايتها , وذلك لإن هناك تغير طرأ على الصفحة . هذا فى المجمل العام , ولكن على ماذا يحتوى هذا الملف ونقصد الـ DLL ؟

هذا السؤال يقودنا إلى التفصيل , والذى جئنا من أجله صوب هذة النقطة, فلنرجع نذكرك بالصفحة Default.aspx وملف الكود المصاحب لها , وهذا هو ما يحتويه ملف DLL , ولكن بطريقة مختلفة عن التى تعرفها .

يصل إلى الخادم طلب بالصفحة التى تحمل العنوان Default.aspx فيتم تحويلها إلى Class تسمى Default_aspx وهذا هو المعالج الذى سيتولى معالجة الصفحة !!!!! …………….. كيف هذا ؟ …….. فى بداية الأمر يتم إنشاء Namespace يسمى ASP , وهو الذى يشكل الإطار الخاص بلمفات المشروع (الموقع), وبداخله يتم إنشاء Class لكل صفحة داخل المشروع , تم الإتفاق على تسمية هذة الـ Class بطريقة موحدة لدى الجميع , وهى على هذا النحو : إسم الصفحة _ إسم الإمتداد , أى ان صفحة كمثال Default.aspx ستكون Default_aspx , على الرغم من وجود طريقة لتغير هذا الإسم , وهى الخاصية ClassName والتى نجدها فى Page Directive , وليكن كمثال , إعطائها الإسم “Main” , وعليه , فبدلاً من تسمية الصفحة بـ ASP.Default_aspx ستكون ASP.Main , ومن هذا , فقد قمنا بتحديد اسم الـ Class التى سيتم إنشائها أثناء وقت التشغيل على انه “Main ” ,مع احتفاظ الصفحة بإسمها وهو Default.aspx .

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

ملحوظة :-

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

والسؤال هنا , ما هو مصير ملف الكود Code-behind ؟ …….. كما ذكرنا إنه يتم إنشاء Class تحت اسمDefault_aspx , فإن هذة الـ Class ترث من ملف الكود Code-behind . وإليك جزء من التعريف الفعلى بهذا الملف :-

 

بالطبع , الملف مازال له بقية , تسبقه وتليه , ولكن أردت ان اوضح لك الصورة أنه تم إنشاءClass بإسم uploadfiles_aspx التى فى واقع االأمر هى صفحة بإسم ProfileTest.aspx ترث من ملف Code-behind متمثلاً فى Class باسم Uploafiles . ونجد أيضاً بهذة الـ Class مجموعة من الدوال ,الهدف منها بناء عناصر الصفحة , فنجد أن لكل أداة دالة تقوم بإنشاء هذة الأداة , مثال , لو ان لديك اداة Button1 فى الصفحة , فستجد دالة بإسم @__BuildControlButton1 , وكذلك تجد دالة لإنشاء Form ووضع باقى الأدوات به تحت إسم @__BuildControlform1() , وفى النهاية تجد دالة تجمع الكل فى تسلسل شجرى باسم @__BuildControlTree .وهى دالة Void او (Sub فى vb.net ) . على عكس الدوال السابقة , فنجد ان الدالة BuildControlButton1 تعود بـ Object من نوع button وكذلك BuildControlForm1 تعود بـ Object من نوع Form . يتولى إعطاء امر التنفيذ لهذة الدوال , دالة تسمى FrameworkInitialize , فهى المسئولة عن بناء الصفحة ,من خلال الدوال السابقة .وهى أول ما ياخذ أمر التنفيذ .

وحتى تتضح الصور أكثر فأكثر , إليك جزء من هذا الملف لتقلى نظرة على الدوال التى نتحدث عنها فى الصورة التالية :

 

يتكرر الأمر مع كل صفحة لديك ضمن ملفات موقعك .وليس هذا فحسب ………. , هناك العديد من الملفات المساعدة , اى أن هناك مجموعةClasses يتم إنشائها للمساعدة . كالتى فى App_Code و كملفات Code-behind وغيرها .

تنشأ هذة الـمجموعة من الـ Classes فى الشكل العادى الذى نعرفه , أى بلغة C# ونجد معها ملفات الـ Dll , ولعلك تتساءل , كيف يقوم بإنشاء الأداة داخل الدوال السابقة , أو بالأحرى أين أجد هذة الملفات فى الأساس ؟

حسناً , الإجابة , توجد هذة الملفات فى مجلد خاص تم إعداده للإحتفاظ بما يسمى Pre-Compilation Files وهى الملفات التى نتحدث عنها الإن ,وهو مجلد Temporary ASP.Net Files , والموجود بمكان تثبيتك لبرنامج Visual Studio , أى ضمن ملفات النظام . والذى يمكن أن تصل إليه من خلال المسار التالى :-

C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files

يمتلئ هذا المجلد , بمجلدات آخرى , تخص مشاريعك التى تعمل عليها ,فستجد لكل مشروع لديك مجلد خاص بنفس إسم المشروع دون زيادة أو نقصان .

ملحوظة :

يقوم البرنامج بالتخزين للملفات فى هذا المجلد , إذا كان المستخدم للبرنامج “Administator ”. وغير ذلك فإنه يقوم بالتخزين فى المجلد المعروف Temp . وسواء هذا أو ذاك , فإنه ,يمكنك الوصول إلى هذا المجلد من خلال الكود بإستخدام الخاصية التابعة لـ HttpRuntime Class على النحو التالى :- HttpRuntime.CodegenDir

على الرغم من انه يمكنك تغير مكان حفظ هذة الملفات , عبر تحديد مسار مختلف فى الخاصية tempDirectory الخاصة بالعنصر Compilation داخل Web.config . ولكن هذا الأمر يعود إليك .

يجدر بنا الآن الإتجاه إلى الملف وتفصيل ما به .

Temporary ASP.Net Files

الترجمة لهذا الاسم , هى ملفات ASP.Net المؤقته , يحتوى هذا المجلد على مجلدين بأسماء عشوائية , وتحتوى على الملفات التى تنشأ أثناء وقت التنفيذ , أى بجرد إنشائك لمشروع موقع , ومن ثم عملRun لإحدى الصفحات ,ليقوم بدوره بتوليد مجلد لهذا الشأن ,به ملفات سنتعرض لذكرها الآن , وهى :-

ملفات يسبقها الإسم APP_Web , مثال :- App_Web_dpk5r4ef.dll

هذا الملف , هو ملف Assembly , وسنجد به الأكواد التى تخص كامل صفحات المجلد الواحد داخل الموقع , حيث يتم تجميع صفحات كل مجلد على حده , داخل ملف dll , وحتى يتمكن الـ Runtime من التفرقة بين المجلدات , يقوم بتحديد رقم لكل مجلد ,كالرقم الذى تراه فى هذا الملف : App_Web_dpk5r4ef.dll .

ملحوظة :-

يمكنك تصفح هذا الملف عبر أداة IL Disassembler , فما هو إلا ملف معد بلغة MSIL كما تعلم , وتجد هذة الأداة ضمن محتويات اداوت Visual Studio , داخل قائمة Start >> Program بالطبع .

محتويات هذا الملف هى الـ Namespaces و الـ Classes التى تحدثنا عنها سابقاً , ونأخذ مثال صفحة ما موجودة داخل الموقع, نجدها تاخذ هذا الأسم :App_Web_dpk5r4ef.7.cs , لاحظ أنها بإمتداد cs أنها Csharp . أى يمكن رؤية الأكواد التى بها , وبالطبع انت قد رأيتها من قبل فى بداية الحديث عن تلك الملفات .

ملحوظة :-

على الرغم من انه , تشكل صفحات المجلد الواحد ملف Dll مستقل بذاته , يحتوى على classes تتشكل بها صفحات هذا المجلد , إلا انه يمكن ان تشكل الصفحة الواحدة ملف Dll خاص بها , أى ,سيكون هناك ملف dll لكل صفحة .وهذا ليس بأمر كبير , ولكن هذا حسب الرغبة , وتقوم بذلك الخاصية Batch عند إعطائها القيمة false فى عنصر compilation فى ملف Web.config .

يتبع ملف App_Web_dpk5r4ef.7.cs نمطاً معيناً فى التسمية وهو :   App_Web_[Folder- Hash].[inedx-Zero].cs , حيث تدل App_Web على أن هذا ملف يخص صفحات الموقع , و Folder Hash هو رقم يخص المجلد الموجود به الصفحات , وindex-Zero هو الرقم الذى يفرق بين الصفحات وبعضها .ووظيفة هذا الملف تتمثل فى إنشاء class تضم الأدوات المدرجة داخل صفحة ASPX وهى نفس إسم Code-Behind Class , ولعلك تتسأءل عن كيفية تسمية إثنين من Classes بنفس الإسم , دون حدوث اى إعتراض من الـCompiler , تنحصر الإجابة فى تعريف كلاً منهما بإستخدام الكلمة المحجوزة Partail , فدورها هو السماح بتجزئة Class إلى اكثر من ملف . مع الحفاظ على مشاركة عناصر الـ Class داخل هذة الملفات , لذلك تجد أسماء الأدوات التى قمت بتعريفها فى صفحة ASPX موجود ومتاحة داخل ملف code-behind , مما يمكنك من التعديل او القراءة منها او الكتابة إليها . وقد نفصل فيها فيما بعد إن شاء الله. إذاً , فهذا الملف يحتوى على namespace بإسم ASP وclass تخص الـصفحة و كذلك الـ Class الجديدة التى يتم إنشائها كمثال , Page_aspx , و فيما بعد يتم إنتاج ملف Dll يتولى عملية التجميع.

قد تجد ان هناك يحمل الكلمة Delete فى آخره , مثال , App_Web_tisu4w4e.dll.delete , ويشير هذا الملف إلى ملف كان يستخدم من قبل , ولكن تم التعديل فى أحد محتوياته , فتم إنشاء غيره , وإعطائه اللاحقة delete , للإستعداد لحذفه , عند إعادة تشغيل التطبيق .

ملحوظة:-

يعاد تشغيل التطبيق,عن التعديل فى أحد الملفات الهامة مثال, Web.Config أو Global.asax , او عند إستدعاء هذا الأمر برمجياً من خلال الكود بإستخدام الدالة HttpRuntime.UnloadAppDomain

ملحوظة :-

يتم وضع كل تطبيق خاص بـ ASP.Net داخل ما يسمى AppDomain واحد فقط , أى أن , كل تطبيق لدية AppDomain واحد مميز عن البقية , والفائدة من ذلك , هو توفير العزلة (Isolation ) للتطبيق عن بقية التطبيق على الخادم .

وصلنا إلى نقطة أن الملفات ذات الإمتداد cs فى هذا المجلد , توضع فى ملف واحد dll ليتم تجميع صفحات المجلد الواحد بداخله , ليقوم بدوره بالرد على طلبات الخادم التى تصل إليه , وإخراج محتوى للمستخدم يتم إرساله للمتصفح . وهنــــا سؤال , كيف يجمع بين هذة الملفات للصفحة الواحدة , وكيف يفرق بين تلك الصفحات , وماذا حدث تغيير فى احد الملفات التابعة لصفحة واحدة , كالتعديل فى مظهر الصفحة من زيادة أو نقصان اداوت , أو التغيير فى الكود الخاص بالصفحة أو تغيير فى صفحة الـ Master وغير ذلك من الملفات التى تتشكل منها الصفحة ؟

الإجابة على هذة الأسئلة , تأتى عند سؤالك عن ملف ينتهى باللاحقة .compiled كما ترى فى هذة المجلد الموقت مثال هذا الملف , default.aspx.cdcab7d2.compiled , فما حقيقة هذا الملف ؟

تسمى هذة الملفات بإسم Preservation Files , اى ملفات الوقاية , حيث يوجد لكل صفحة داخل الموقع ملف مستقل بذاته , وهو عبارة عن ملف xml , ,يمكنك ان تلفى نظرة عله من هنا :-

وبه يتم تحديد الـ Class المرتبطة بها هذة الصفحة متمثلة فى الخاصية Type, وكذلك ملف الـ Assembly الموجود به هذة الـ Class متمثلاً فى الخاصية Assembly , ومسار الصفحة متمثلاً فى الخاصية VirtualPath , ورقم يحدد حالة الملفات التى لها تبعية بهذة الصفحة والمتمثلة فى الخاصية FileHash وتلك الملفات التابعة تجدها داخل عنصر filedepsوللكشف عن حدوث تغييرات فيها , ورقم أخر يراقب حدوث تغيرات فى الصفحة نفسها , متمثلاُ فى الخاصية Hash .

ونجد ان هذة الملفات تتبع نمطاً معينا فى التسمية على هذا النحو :-

[page].aspx.[folder-Hash].Compiled

ملفات يسبقها App_Code

ومن إسمها ياتى دورها , ويدل الإسم على أن هذة الملفات هى ملفات الأكواد التى توضع بداخل مجلد App_Code .

وبالطبع هناك ملف ينتهى بـ .Compiled كمثال , App_Code.compiled , والذى سبق ذكره من قبل , كذلك سيكون هناك ملف dll يجمع اكواد هذا المجلد بداخله كمثال : App_Code.zxopytkk.dll.

كذلك ملفات يسبقها App_Theme , وأخرى App_GlobalResources وغيرها من مجلدات المشروع الإساسية .وينطبق عليهم نفس الشئ كسابقيهم .

لعل من أبرز ما ننوه عنه هنا ان هذة الملفات تنتج فقط عند حدوث طلب لاحدهم , اى انه يتولد ملف للصفحة عند طلبها , وكذلك ملفات App_Theme عند إستخدامها , هذا لا يتعارض مع وجودها ضمن ملفات الموقع , ولكن تنتج ملفات Compilation عند إستخدام احد الصفحات لـملفات Themes . وهكذا الحال مع Resources.

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

لذلك , هناك ما يسمى Pre-Compilation , لإداء هذة المهمة على جهازك الخاص , ومن ثم رفعها على الخادم , وكل ما تحدثنا عنه حتى الإن من إنشاء هذة الملفات داخل هذا المجلد المؤقت Temporary ASP.Net Files , تعد نوعاُ من أنواع الـ Pre-Compilation , وتسمى In-place .

و النوع الآخر , وهو Pre-Compilation For Deployment .أى إجراء هذة العملية من أجل النشر , أى نشر الموقع على الخادم .

فسواءً كان هذا أو ذاك , يوجد اداة واحدة مسئولة عن إتمام هذة العملية , وهىaspnet_Compiler . والأمر جد بسيط , فما يتوجب علينا فعله هو, إعطاء هذة الأداة مكان الموقع المراد إنتاج الملفات له , والمكان المقصود الذى يتوجب حفظ الملفات المنتجة به . وتاتى على هذا النحو :-

aspnet_compiler -p “YourSitePath” -v / “TargetPath”

فنجد أن الـP تشير إلى Physical path ,ونجد ان v تشير إلى Virual Path .

ملحوظة :-

يمكن تصفح هذة الأداة من خلال وصولك إليها فى هذا المسار :-

C:\Windows\Microsoft.NET\Framework\[version]

لكن ستجد امراً غريباً , فى الحقيقة هو ليس غريباً بدرجة كبيرة , حيث ستجد أن الصفحات بالفعل تم إنشاء آخرى مشابهة لها فى الإسم ولكن ليس فى المحتوى , أى أنك ستجد صفحة بإسم Default.aspx ولكن محتواها عبارة عن سطر واحد هو كالتالى :-

This is a marker file generated by the precompilation tool, and should not be deleted!

ما الذى حدث ؟ ………………. ما حدث هو انه , أخذ المحتوى ووضعه فى مجلد Bin ضمن محتويات ملف Dll وملفات أخرى كالتى رأيتها من قبل مثال ملفات compiledو App_Web…. ,وغيرهما .ولكن لم يعد هناك ملفات ذات إمتداد cs , حتى تسمح لك بالتعديل ,وبعد هذة الخطوة يمكنك أن تنشر ملفاتك على الخادم , ليراها الجميع , ولكن تبقى عقبة التعديل والتحديث فيما بعد .حيث انك لا تملك التعديل فى أى من ملفات aspx ولا Code-behind .

يوجد حل لهذة العقبة ,ولكن ليس حلاً كاملاً , فتقدم هذة الأداة “aspnet_compiler” , الأمر “updateable ” , والذى يشير إليه الحرف u , فعند إستخدامه ,يقوم بنسخ الملفات ذات الإمتداد aspx,ascx,master,ashx كما هى إلى المجلد الذى قمت بتحديده , حتى يمكنك تحديثه فيما بعد , أى يمكنك إضافة أو حذف اداوت من هذة الصفحات . ولن تحتاج إلى إعادة نشر ملفات الأكواد مثال Code-behind , لإنها بالفعل متواجدة من قبل , وغير مسموح لك بالتعديل فيها , لإنه قد تم إنتاجها فى صورة dll .,إذاً , فيمكنك فقط التعديل فى aspx ولكن لا يمكنك التعديل فى Code-behind , ومع طلب الصفحة بعد التعديل يقوم الـcompiler بتحديث ملف dll ليشمل التحديثات .

ومن أجل هذا المقصد نستخدم التالى :-

aspnet_compiler -u -p “YourSitePath” -v / “TargetPath”

والملخص هنا :- يمكنك عمل Pre-Compilation لتحسين الأداء عند تصفح الموقع للمرة الأولى فقط“. وكذلك يمكن إستخدام الأمر u والذى يشير إلى “Updateable” , للحفاظ على إمكانية تحديث ملفاتك بعد عملية النشر .

نهاية الدرس

رأينا كيف ان كل شئ خاص بـ ASP.net يتم تحويله إثناء وقت التشغيل إلى Object , ورأينا كيف يتم عمل Compilation ,وتصفحنا معاً مجلد Temporary ASP.Net Files , وتعرفنا على بعض الملفات التى يمكن أن توجد بداخله , ومؤخراً , تعرفنا كيف نقوم هذة العملية من أجل النشر .ورأينا كيف يمكن إضافة إمكانية التحديث ضمن أوامر اداة aspnet_compiler .

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

والسلام عليكم .

Advertisements

تعرف على بـ ASP.Net ,الجزء الرابع: Global.asax,Modules,Handlers

Global.asax , HttpModules , HttpHandlers

ما زلنا فى هذة السلسلة من المقدمة التعريفية بـ ASP. Net ,إستعرضنا معاً الجزء الأول , الجزء الثانى , والجزء الثالث , وفى الجزء الأول من هذة السلسة ذكرنا خط سير HttpRequest ,حيث تبدأ الرحلة من جهاز المستخدم إلى ان تصل إلى الخادم , ثم تعود للمستخدم مرة أخرى بناتج الطلب وهو HttpResponse . أثناء هذة الرحلة ذكرنا ان هناك ما يعرف بـ HttpModules وHttpHandlers , وذكرنا الكثير من المسميات التى لم نفصل فيها مثال Global.asx , HttpModules, HttpHandlers ونأتى هنا للتفصيل والله المستعان .

Global.asax

المحتويات :-

مقدمة .

ما هو Global.asax ؟

كيف نستخدم Global.asax فى تعريف الإحداث ؟

كيف نستخدم Global.asax فى ضبط إعدادت عامة لكامل التطبيق ؟

مقدمة :

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

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

تعريف ملف Global.asax :

هو ملف إختيارى يضم إعدادت وأحداث عامة لكامل التطبيق الواحد, ويمكن أيضاً أن يضم أحداث تخص HttpModules آخرى , كما هو الحال فى أحداث Start ,End الخاصة بـ SessionModule , له إسم وهو Global.asax, ولابد أن يحتفظ بهذا الاسم , ولابد أيضاً أن يوجد فى أعلى مستوى لتداخل ملفات التطبيق , أى أنه لا يمكن أن يوضع فى مجلد فرعى داخل الموقع.ويأتى على شكلين , إما أن ياتى فى ملف واحد (Markup + Code ) , أو ملفين منفصلين (Markup) + (Code-behind) . كما نذكر أيضاً انه يسمى بـــــ Global Application Class إذا ما حاولت أن تضيفه من نافذة Add New Item.

هذا الملف , كما ذكرنا هو Class ترث HttpApplication , وحين ذكرنا فى درو ة حياة الـ Request , انه يتم إنشاء Instance من HttpApplication , فعند وجود هذا الملف فإن هذا الـ Instance يتم إنشائه من هذة الـ Class التى فى الواقع تسمى Global . وحيث أنه ملف إختارى , أى ربما لن يقوم المبرمج بإضافته!

.فإذا لم يكن هذا الملف موجوداً ضمن ملفات الموقع ,فإن HttpRuntime تقوم بعمل Instance من الإفتراضى عندها وهى HttpApplication Class .

تعريف متغيرات عامة :

يتم ذلك بتعريف متغيرات بشكل عادى جداً وما عليك إلا ان تستخدم إسم الClass للحصول على قيمة المتغير (Global.YourVariable ) , والطريقة الثانية هى Object Server Tags , وتأتى على هذا الشكل(<Object>), وتستخدم إنشاء Instance من Class سواء كانت .Net Framework Class أو كانت COM . يحدد ذلك الخصائص المتاحة فى Object Tag مثال Class لتحدد انك تستخدم .Net framework أو ClassId و ProgId لتعريف COM Component . وكذلك من الخصائص المتاحة أيضاً نطاق تعريف المتغير وتعرف بـ Scope والنطاق المتاح إما ان يكون حسب Session أو Application او AppInstance .لتحدد كيفية الوصول إلى الـ Instance الذى قمت بتعريفه والتعامل معه .نذكر أنه فى حالة Application او Session ستجد المتغيرات الخاصة به داخل Collection بإسم StaticObjects وهى خاصية تتفرع من كلاهما . اما AppInstance , فتجد ها فى نفس مكان تعريفهما لإن appinstance , تدل على أن المتغيرات لا تتشارك مع غيرها , أى لا توجد فى مكان آخر .

ملحوظة :-

يمكنك إستخدام Object Server Tage مع صفحات ASPX , لنفس الغرض وهو إنشاء Object من Class .

اما الأحداث العامة :-

نجد بها أحداث التطبيق التى تم ذكرها فى الجزء السابق وكذلك مضافاً عليها الأحداث والدوال الخاصة بـ Modules آخرى . مثال أحداث SessionModule او دالة تخص كمثال Routing .

Modules and Handlers

مقدمة

ما زلنا فى هذة السلسلة من المقدمة التعريفية بـ ASP. Net ,إستعرضنا معاً الجزء الأول , الجزء الثانى , والجزء الثالث , وفى الجزء الأول من هذة السلسة ذكرنا خط سير HttpRequest ,حيث تبدأ الرحلة من جهاز المستخدم إلى ان تصل إلى الخادم , ثم تعود للمستخدم مرة أخرى بناتج الطلب وهو HttpResponse . أثناء هذة الرحلة ذكرنا ان هناك ما يعرف بـ HttpModules وHttpHandlers , ونأتى هنا للتفصيل والله المستعان .

ذكرنا من قبل ان HttpModule , هو بمثابة مساعد للـ HttpApplication ,والذى هو المسئول عن إدارة التطبيق بجميع صفحاته (التطبيق نقصد به الموقع ). وسنتعرض للـ HttpModule سواء أكان هذا المساعد قد قمنا نحن بإنشائه, أو كان موجوداً بالفعل من قبل , أى تم بنائه بواسطة ASP. Net .وذكرنا أيضاً أن HttpHandlers هى نقطة النهاية التى يصل إليها Request . ليقوم بإلرد على هذا الطلب بإنتاج HttpResponse , وسيكون به مخرجات العملية . ولا نقول انه أخر مرحلة فى رحلة الطلب ,ولكن نقول أنه المسئول عن معالجة الطلب وإخراج ناتج .وسنعرف فيما بعد , انه ما هو إلا جزء من دورة حياة التطبيق , وسنرى كيف يأخذ أمر التنفيذ فى أحداث التطبيق العامة. وسنتطرق إلى بعض الأمثلة ومزيد من التفصيل حولهما .

HttpModules

المحتويات:-

ما هو HttpModule ؟

لماذا HttpModules ؟

Built-in Modules ؟

كيف تقوم بإنشاء HttpModule ؟

علاقة HttpModules بـHttpApplication وكيف يستدعى ؟

ما الفرق بينه وبين global.asax ؟

ما هو HttpModule ؟

فى حقيقة الأمر , HttpModule ما هو إلا Class تقوم بعمل Implement لما يعرف بــIHttpModule وهى Interface بها فقط دالتين هما Init و Dispose . و سنعرف ما فائدة كلاهما بعد قليل , ولكن تأمل الصورة التالية :

دالة Dispose :

ووظيفتها تفريغ محتويات الذاكرة من الـ Objects التى تقوم بتحديدها والتى تم إستخدامها من قبل فى هذا الـ Module .

دالة Init :

وظيفتها تسجيل الأحداث داخل الـ Instance المأخوذ من HttpApplication . وكما ترى هذة الدالة, فإن HttpApplication تمرر نفسها لهذة الدالة .

ولتكتمل الصورة لديك , تأمل الصورة التالية, لترى كف يتم تسجيل الأحداث داخل هذة الدالة :-

Built-In Modules

كما أنه يجب عليك أن تعلم أن هناك Modules قد تم إعدادها مسبقاً من خلال ASP. Net وأخرى يتم إعدادها من قبل المبرمج حسب الحاجة . وإن كنت تذكر خصائص HttpApplication , فقد رأيت فيها خاصية إسمها Modules وهى من نوع HttpModulesCollections . يتم تجميع كل الـ Modules (ما هو موجود بالفعل , وما قمت بإنشائه ) ووضعهم فى داخل هذة الخاصية كما سترى فيما بعد . والهدف من إنشاء هذة الـ Modules , هو القيام ببعض الأعماللخدمة الطلب الحالى , ولا ننسى أنه أيطلق على هذة الـ HttpModules إسم Filter , أى أنها تقوم بعمل تنقية للطلب الحالى . والتنقية هنا هى إجراء عمليات غرضها التأكد من عدة أمور كتسجيل وحجب أومنع وإخفاء وإظهار وأشياء كثيرة .

وأمثال هذة الـ Modules التى تم بنائها من خلال ASP. Net تلقائياً ودون تدخلاً منك ما يلى :-

OutputCacheModule
SessionModule
WindowsAuthenticationModule
FormsAuthenticationModule
PassportAuthenticationModule
RoleManagerModule
UrlAuthorizationModule
FileAuthorizationModule
AnonymousIdentificationModule
ProfileModule
ErrorHandlerModule
ModuleServiceModel
ScriptModule
DefaultAuthenticationModule

كما ترى فهى مسميات قد تعاملت مع بعضهم من قبل, ولعلك تتساءل أين تجدهم , أو فى أى مكان نستطيع أن نلقى نظرة عليهم , بالفعل سأخبرك , قد تحتاج أولاً أن تذهب إلى Machine.Config , وترى الجزء الخاص بـ HttpModules .ولكن هؤلاء من قام النظام بإنشائهم من أجلك , ولكن ما قمت أنت بإنشائهم فسوف تعرف مكانهم , لإنك أنت من سيقوم بكتابة النص الخاص بتسجيلهم, حتى يتم التعرف عليهم.

ملحوظة :-

يمكنك ان تحصل على قائمة بإسماء الـ Modules الخاصة بك , من خلال إستخدام الخاصية Modules الموجودة فى HttpApplication والتى ورد ذكرها فى الجزء السابق , فقم بالعودة إليه .ولاحظ أنها Collection , أى يمكنك إخراج ما بها بإستخدام For, Foreach وما شابه ذلك من جمل التكرار.

كيف تقوم بإنشاء HttpModule ؟

عند حاجتك لإنشاء HttpModule , فإنك أولاً تحتاج أن تنشأ Class ,ثم تسجل بها بعض أحداث HttpApplication , ثم بعد ذلك , يأتى دور تسجيل بيانات هذا الـ HttpModules فى ملف Web.config , وإليك الخطوات بالترتيب :-

1- إنشاء Class ترث من IHttpModule .

2- تسجيل بعضاً من أحداث HttpApplication لنقوم بمعالجة ما نريد فى هذة الأحداث , وذلك فى دالة Init .

3- تسجيل ما قمت بإنشائه فى ملف Web.Config .

وحيث أنك قد رأيت الخطوة الأولى والثانية مسبقاً فإليك الثالثة :

 

فكما ترى , Name لتحديد الإسم , Type لتحديد إسم الـ Assembly الموجود فيه الـ HttpModule .

ما هى العلاقة بين HttpModules وبين HttpApplication ؟

إلى هنا , أصبح لدينا علم بإن هناك مجموعة من HttpModule فى ملف Machine.Config وكذلك ما نقوم نحن بتعريفه نجده فى ملف Web.Config , فما العلاقة بينهم وكيف يتم الجمع بينهم وكذلك ما العلاقة بين HttpModules وبين HttpApplication ؟

فى الواقع , هى دورة حياة , وإن شئت أطلق عليها سلسلة أحداث أو خطوات او دوال تنفذ بترتيب مسبق“. ضمن هذة الأحداث تستدعى دوال خاصة بـ HttpApplication يقوم من خلالها بتجميع كل الـ Modules المتاحة , ومن ثم إستدعاء الدالة Init الخاصة بـ HttpModule , وإليك بالفعل السيناريو القائم عليه العمل من خلال الشكل التالى :

 

بفضل الله , قد يكون الشكل موضحاً لما نريد أن نقوله , فما الأمر إلا دالة تنادى على دالة أخرى وتقوم ببعض الأعمال بترتيب معد مسبقاً , وذلك حتى تتوافق العملية منطقياً , فالمنطق هنا , أنه لابد من الكشف أولاً عن كل الـ Modules , ومن ثم ,تجميع بياناتهم , وبعدها يمكننا أن نفعل بهم ما نشاء , ولكن , كل ما نريده هنا هو إعطائهم الأمر بالتشغيل. وفى طبيعة الأمر , نجد أن وظيفة HttpModules الفعلية, تسجيل أحداث داخل دورة حياة التطبيق فقط , وهذة الأحداث بدورها عند التنفيذ , تقوم بعمل ما قمنا بإنشائها من أجله.

مستخلص هذا الكلام , نخرج بتعريف للـ HttpModules , ونقول أنها , Class تقوم بعمل Implement لما نعرفه بإسم IHttpModule , الهدف منها تسجيل أحداث ضمن أحداث الـ HttpApplication .

ما الفرق بين HttpModules وبين ملف Global.asax ؟

قد يقول قائل , لماذا أستخدم HttpModules ,وبالفعل يوفر لى ملف Global.asax نفس المهمة , نعم فى كلاهما , انت تقوم بتسجيل أحداث الـ HttpApplication . ولكن هناك ما نعرفه بإسم “Reusable Code” . نقصد إعادة إستخدام ” , وكذلك بعض الإستقلالية عند العمل مع HttpModules , فإذا تحدثنا عن Module يقوم بعمل حجب الموقع من خلال IP المستخدم . ونريد إعادة إستخدامه . فهل يمكن ان نأخذ ملف Global.asax , وقد يكون به معلومات تخص مشروع آخر , وبالفعل كذلك . فنجد ان HttpModule يوفر لنا الإستقلالية , وكذلك قبول العمل على أكثر من مشروع .فيمكن أيضاً ان نقوم بتضمينه داخل Assembly File ,وما يستوجب فعله هو ,تسجيله فى ملف Web.Config .

HttpHandlers

المحتويات:-

ما هو HttpHandler ولماذا ؟

متى يتم تنفيذه ؟

كيف تستخدم HttpHandler ؟

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

كما رأينا ان الطلب الذى يصل إلى الخادم يحتاج إلى ان يتم معالجته , فالمسئول عن معالجة الطلب وإخراج ناتج يسمى Handler , وتمتلك ASP.Net العديد من HttpHandler المبنية بداخلها , والتى تعتنى بمعالجة العديد من الطلبات المتواجدة فى ASP.Net , نجد ذلك فى صفحات ASPX , وكذلك تعقب الصفحات المعروف بـTrace متمثلة فى محتوى يتم تضمينه داخل صفحة ASPX أو إعلان إستقلاله داخل صفحة خاصة به تحت إسم Trace.axd ,وغيرهما مما يمكن لك ان تعرفهما مع الوقت ومع تصفح الجزء الخاص بـ Mapping Handlers فى نافذة إدارة الخادم IIS .

حتى تكتمل الصورة لديك ,كيف يقوم الخادم (IIS ) بتحديد المعالج(Handler) الذى سيقوم بمعالجة الطلب ؟ , لو بدأنا الأمر من أوله لا نجد إلا مستخدم قام بكتابة عنوان موقع فى شريط العنوان الخاص بالمتصفح , لينشأ بذلك HttpRequest يحمل معلومات عن الصفحة المطلوبة وعن الـ Client ومعلومات آخرى , ولكن ما يهمنا هنا هو عنوان الصفحة المطلوبة , فهنا يصل إلى الخادم عنوان الصفحة , فيقوم بفحص الإمتداد الخاص بالصفحة , ومن ثم , توجيه الطلب إلى المعالج (Handler )المسئول عن معالجة هذة النوعية من الطلبات .

وما وراء المشهد هنا , أن الأمر ليس إلا Class تقوم بتنفيذ مجموعة من الأوامر لتقوم بالرد على الطلب وإخراج ناتج وإنتاج HttpResponse. هذة الـ Class لها شروط . هذة الشروط أولها أن تقوم بعمل Implement لما يعرف بـ IHttpHandler , وهى Interface سنتحدث عنها بعد قليل . ونذكر أيضاً الإختيار الثانى وهى ان تقوم هذة الـ Class بعمل Implement لما يعرف بـ IAsyncHttpHandler ,وذلك فى حالة أن

الطلب غير متزامن مع غيره وهو ما يعرف بـ asynchronous .

محلوظة:-

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

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

Web.Config المتواجد ضمن ملفات الموقع الذى تعمل عليه .

ملحوظة:-

Web.Config هو الملف المسئول عن إعدادات التطبيق وكذلك إدارة الموقع من جميع الجوانب , كجوانب الحماية والإعدادت العامة , وتسجيل إعدادات تخدم كامل الصفحات,وتسجيل العديد من الـ HttpHandler والـHttpModules وغيرهم الكثير. ويعتبر بمثابة توجيهات وإرشادات , بل وتعليمات لابد أن يأخذها الخادم فى إعتباره عند معالجة الطلبات .وهذة التعليمات قد تنص فى بعض الأحيان إلى أن يصدر الأمر للخادم بأن يقوم بتغطية ما لديه من إعدادات لتحل محلها الأعدادات الجديدة المعرفه داخل ملف Web.config.

ما هى IHttpHandler ؟

من إسمها نجد انها تبدأ بأول حرف وهو I والذى يشير فى بيئة .Net على انها Interface . نعم هى Interface , تحتوى على دالة واحدة وكذلك خاصية واحدة وهما على التوالى ProcessRequest و IsResuble .

فالدالة Process Request من المفترض ان يكون بها خطوات أو إجراءات معالجة الطلب . فإذا أخذنا طلباً لصفحة ASPX , نجد أن دورة حياة الصفحة ASPX ينفذ هنا فى هذة الدالة , وبالفعل إذا أردت ان تنشأ Handler ليعالج نوعية من الطلبات فما عليك إلا أن تكتب الكود الخاص بك هنا .

اما الخاصية IsResuble , نعم الإسم دال على معناه , وهو هل يعاد استخدامه ” ,ولكن من هو الذى سيعاد إستخدامه ؟! , من سيعاد إستخدامه هنا هو الـ Instance الذى تم إنشائه من هذا الـ Handler . بمعنى انه, إذا كانت هذة الخاصية بـ True , فإن هذا الـ Instance سيتم الإحتفاظ به فى الذاكرة ليقوم بخدمة طلبات آخرى . وغالباً ما يتم ذلك فى الطلبات المتكرره كثيراً من نفس النوع . وبالطبع إذا كانت الخاصية تعود بالقيمة False فإن الـInstance سيقوم بخدمة طلب واحد فقط .

متى يتم الـHttpHandler ؟

لو تراجعنا قليلاً إلى الجزء السابق ورأينا دورة حياة التطبيق وتاملنا فى الأحداث ,وخاصةً عند الحدث MapRequestHandler الذى يعلن عن تحديد الـ Handler الذى تم إعداده ليقوم على خدمة الطلب الحالى,ونجد أن الخطوة التالية لذلك هو إنشاء Instance منه , ومن ثم إعطائه الأمر بالتنفيذ , وذلك يكون من خلال إعطاء الأمر بالتنفيذ للدالة السابق ذكرها وهىProcessRequest.والتى تقوم بدورها فى معالجة الطلب وإخراج ناتج ليتم إنتاج HttpResponse

ما هو Generic Handler ؟

قامت ASP.Net بتمكين مطورى المواقع بعنصر جديد وهو Generic Handler والذى يمكن أن يستخدمه المطور ليعالج أو يخدم أى طلب من أى نوع ,كيفما شئت, بمجرد أن تضيف هذا العنصر من Add New Item . وما هو إلا نموذج جاهز يمكنك من العمل على HttpHandler

كما يمكن تصفحة والتعامل معه كأنه صفحة مستقلة , ومما يزيده مرونة , انه لا يحتاج أن تقوم بتسجيله فى ملف Web.config. ولكن أهذا يعنى أننا لا نحتاج إلى الخطوة التى تنص على تسجيل HttpHandler فى Web.config , كلا ……….. ! , أنت تحتاج دوماً إلى هذة الخطوة . وإن إفتقدتها هنا , فهذا لإن Generic Handler يقوم بخدمة الطلبات, أو إن شئت قل ,صفحة تسمى Handlername.ashx , ولكن قد تحتاج إلى تقوم بخدمة طلب ما يقوم على صفحات rss أو img أو شئ آخر (الأمر لا يتوقف عند إسم بعينه) . فعليك ان ترشد الخادم إلى أن هذة النوعية من الطلبات , تتم معالجته بـالــClass التى إسمها كذا . على سبيل المثال , أن نقول للخادم ,أن أى طلب لصفحة تحمل إمتداد rss , كمثال صفحة(filename.rss ) قم بخدمة الطلب من الـClass صاحبة الإسم rssHandler (وبالفعل نحن من قام بإنشائها).

كيف نستخدم HttpHandler ؟

إليك الأمر فى خطوات :-

1- إنشاء Class وعمل Implement لــ Interface ,قد عرفناها بإسم IHttpHandler .

2- كتابة الإجراءات التى تريد القيام بها لخدمة الطلب داخل دالةProcessRequest .

 

3- التسجيل داخل ملف Web.config . وإليك الشكل التالى :-

 

ومن هنا إذاكان الإمتداد (Extension) المذكور بالأعلى هو rss على سبيل المثال , فإننا عندها يمكن أن نصل إلى ملف بهذا الاسم عبر المتصفح (LastNews.rss) ليكون الرابط هكذا :- http://localhost/TestAhmed/LastNews.rss .وبالفعل ليست هناك صفحة أو ملف فى الواقع بهذا الاسم .ولكن ما سيتم عرضه فى الصفحة هو ناتج تنفيذ دالة ProcessRequest داخل الـClass الذى قمنا بإنشائه .

Sessionstate وموقفها من HttpHandler ؟

قد نحتاج إلى إستخدام Session والبيانات المخزنة بها داخل الـ Handler الذى نعمل عليه ,فلو أنك قمت بإستخدام الـ Session فى مهمتك ,لخرج لك خطأ , تم إصداره ليبلغك انها فارغة . أى ان الــSession فارغة ,مع العلم أنك بالفعل قمت بتخزين قيمة فيها .ولكن ما يحدث , هو أن الـHandler لا يملك إفتراضياً التعامل مع Session , ووجب علينا إعلامه بذلك .

ما يقوم بإعلام الـ Handler بمراعاة إعطاء تصريح لقرءاة وكتابة بيانات إلى SessionState هى Interface تسمى IRequiresSessionState. وليس لديها أى دوال او خصائص كما هو الحال مع أى Marker Interface مثلها . فلا تحتاج إلى كتاية أكواد , غير أنك تقوم بإعلان إستخدامها بجانب الـ Class فقط .

ملحوظة :-

يوجد ما يسمى بـ Marker Interface , يتم إستخدامها كأى Interface عادية .إلا أنها لا تحتوى على دوال أو خصائص , غير انها تقوم بإعلام الـ Runtime ببعض الأشياء .على سبيل المثال INamingContainer ,والتىتقوم بضمان وجود ID مميز لكل أداة داخل الصفحة أو الأداة التى تحتوى على أدوات بداخلها وتقوم بإنتاج Namespace وهمى لكامل أدوات الصفحة و سنراها فى أجزاء قادمة فى مزيد من التفصيل إن شاء الله . وبالطبع , ما نحن بصدده الآن وهى IRequiresSessionState , والتى تعلن عن حاجة الـ Handler إلى القراءة والكتابة من وإلى SessionState .

نهاية هذا الجزء

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

ترجمات : الكتاب الثانى Transact-SQL

الكتاب الثانى :-   2071B Querying Microsoft SQL Server 2000 with Transact-SQL


يأتى إليكم الكتاب الثانى وإن كان يميل إلى التلخيص ,ولكن يشكل هذا الكتاب إن شاء الله فارقاً لقارئيه فى مدى معرفته بكتابة الإستعلامات بإستخدام Transact-SQL  . وننوه أيضاً أنه يمكنك وضع رابط للكتاب فى أى مكان شئت , ولكن رجاء رجاء ممن يقوم بتحميل الكتاب أن يشير إلى المصدر الرئيسيى عند نشره للأخرين وذلك لضمان حصول الجميع على نسخة واحدة منقحة تنقحياً جيداً .مما يمكن أن يطرأ على هذة النسخة من تعديلات .ووفق الله الجميع لما يحب ويرضى .

يمكنك التحميل من هنــــــــــــــــــــــــــــــــــــــــــــا

والسلام عليكم ورحمة الله

تعرف على 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 .

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

Page Controller Pattern

كان فى بداية الأمر, حيث وجود asp (وتسمى ASP Classic ) , يتم خلط الأكواد بعضها ببعض فى صفحة واحدة , ونقصد هنا أكواد Html مع أى كود Script ,أو حتى فى ASP.Net عند إستخدام Inline Code يحدث نفس الأمر .فكانت الحاجة لفصل الأكواد فى أماكن مختلفة , فجاءت فكرة Code-behind , فأصبحت كل صفحة لها ملف كود فى الجوار . هذا الملف هو المتحكم فى طريقة إخراج Html للصفحة وكيف ستتكون الصفحة . هذا الإسلوب فى العمل يتبع إسلوب Page Controller .

فما هو Page Controller Pattern ؟
هى عملية إنشاء ملف أو
Object ليقوم بمعالجة طلب لصفحة واحدة او معالجة حدث داخل هذة الصفحة” .ومن الواضح , أنه نفس التعريف الذى ستنعرف به ملف Code-behind .وهذا أمر طبيعى .لإن ملف code-behind تم إنشائه إعتماداً على إسلوب Page Controller . وعليه, فإن Page Controller تقوم بالعمل على صفحة واحدة فقط . فوجب وجود Controller مصاحب لكل صفحة . وهذا هو حال ملف Code-behind. كما ترى فى الشكل المقابل :

 

هنا يمثل ملف Page1.aspx.cs (ملف Code-behind ) ملف Page Controller . فهناك Controller لكل صفحة على حده . ووظيفته التحكم فى تركيب الصفحة لعرضها للمستخدم .ونقصد هنا بالتركيب إعداد عناصر الـ HTML التى ستظهر فى الصفحة .

ملحوظة: لعلك رأيت كلمةPattern , ترتبط بكلمة أخرى فى عالم البرمجيات و هى design . وتعريف Design and Pattern هو :”أساليب وطرق بمعايير محددة يتم إتباعها لتصميم حل لمشكلة برمجية ”.بالطبع هناك العديد من الكتب التى صدرت فى الحديث عن Design and Pattern , ولن يكفى التعريف الذى قدمناه .و حيث أنها أساليب وطرق فإن هذة الكتب تتحدث عن تلك الأساليب والطرق .

يشترك ملف Code-behind لصفحة 1 مع نظيره لصفحة 2 و3 وغيرهم فى كثير من الأمور , ولعل أبرزها دورة حياة الصفحة , من إنشاء للصفحة وإعطاء قيم إبتدائية لها وتحميلها وحفظ حالتها وأمور اخرى مما سنراه إن شاء الله عند دراستنا لدورة حياة الصفحة .

أليس من البديهى لمن على دراية بامور الوراثة فى عالم البرمجيات أن يقول , “ولما لا نضع تلك المراحل المشتركة فى Interface أو Class ونستخدم الوراثة” . رأى صواب تماماً , وقام به بالفعل فريق تطوير ASP. Net . فتم إنشاء Base Class به تعريف تلك المراحل , وعند إنشاء صفحة جديدة , ترث هذة الصفحة من هذة الـBase Class ,مع إمكانية التعديل فى هذة المراحل بما يناسب هذة الصفحة .

فكانت Class Page هى الـ Base Class . والتى نجدها فى هذا المسار System.Web.UI,Page . حيث نجد أن كل صفحة (Code-behind ) ترث من System.Web.UI,Page . كما ترى فى الصورة :

 

ورجوعاً إلى الدرس السابق أين وجود الـ HttpHandler ؟ ألم نقل أنه المسئول عن معالجة طلب الصفحة وإخراج كود HTML ؟ بلى , قلنا ذلك , إذاً أين هو ؟

تعد هنا Class Page هى HttpHandler . لا عجب , فإن Page ما هى إلا Class تقوم بعمل Implementation لما نعرفه مسبقاً بـ IhttpHandler. فكما ترى فى الشكل التالى :

هذا ما هو بالفعل موجود , ولكن فى المشاريع الكبيرة , قد نجد انه مازال هناك أمور مشتركة بين صفحات الموقع الواحد , ليس دورة حياة الصفحة فحسب .فماذا سيحدث ؟ . هنا متاح لك أن تقوم بعمل Controller وسيط . أى Class وسيط , على مثل هذا الشكل :

 

أذكر يوماً اننى إستخدمت هذة الطريقة , وكان الموقف حينها , أننى أريد أن أعالج نسيان كتابة عنوان للصفحة لأستبدل Untitled Page “ بعنوان دال ذو معنى ,وكان ذلك سيطبق على كل الصفحات , فكان حلاً موفقاً . أن أقوم بمعالجة ذلك فى Class وسيط وهى بدورها ستقوم بالعمل مع كل الصفحات . وتم العمل بنجاح .

 مشاكل Page Controller  Pattern

يصاحب هذا الـ Pattern بعض المشاكل , او دعنا نركز على Classic ASP. Net , فأنت لا تملك التحكم التام فى أكواد HTML . كذلك لاتملك ان تجرى إختباراً دون ان تقوم بإجراء معاينة للمشروع على أرض الواقع .أى أنك لا تستطيع إختبار كود مكتوب فى حدث Button إلا بعد ان تقوم بالضغط على هذا الـButton , وهذا الأمر يمكن ان تنساه عند إستخدام أدوات Unit Testing . فهى تسمح لك بإختبار الكود دون الحاجة إلى أن تقوم بإجراء معاينة أولاً . ولكن المشكلة أن Unit Testing لا تعمل مع ASP . Net . مشكلة أخرى وهى زيادة عدد الملفات المصاحبة لكل صفحة (Code behind ) , مما قد يؤدى إلى وجود بعض الصعوبات فى تقديم يد العون للكود لإجراء إصلاحات عليه . فجاءت لنا ASP. Net MVC .

ASP. Net MVC

تنويه : لن نتاول MVC كدراسة ولكن سنشرح الـ Pattern القائم عليها MVC . وكذلك إساسيات بناء هذة البيئة فقط .

مقدمة :

MVC :إختصاراً لـ Model-View-Controller , ولا تعد إصدار جديداً من Classic ASP. Net , ولكن هى framework قائم بذاته . وتعتبرASP .Net MVC طريقة أخرى واسلوب آخر لتطوير مواقع الإنترنت إعتماداً على ASP. Net ومزاياها الموجودة من قبل . وأخبرت مايكروسوفت عملائها , بأنهما إسلوبين يمكن أن تتبع أحدهما او كلاهما حسب حاجتك والتصميم الذى تراه مناسباً للمشروع الذى تعمل عليه .

تقوم MVC على Pattern يسمى Front Pattern , وهو يقوم على وجود Controller واحد يخدم اكثر من صفحة(View) . كما هو الحال فى الشكل التالى :

 

على الرغم من أن MVC تقوم على Front Pattern إلا أنها فى حد ذاتها هى Pattern ,يقوم على مبدأ الفصل بين اكوادHTML , والتى تعرف بـ (View ) وبين الكود المصاحب للصفحة الذى يدير إدارة هذة الصفحة وردود الأفعال إستجابة للمستخدم والتى يعرف بـ (Controller ) . ويشمل الفصل أيضاً ,طبقة التعامل مع قواعد البيانات والتى تعرف بـ (Model) . وعلى هذا فإن MVC تعمل على ثلاث محاور وهما :Model View Controller . كما بالشكل :

 درس خفيف , ويتبعه إن شاء الله دروس أخرى . تنتاول التالى :

– HttpModules

– HttpHandlers

– Application Life Cycle

-Page Life Cycle

وفق الله الجميع , لما فيه الخير .

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

مقدمة عن ASP. Net ما وراء المشهد

توضيح والله المستعان :

سنركز فى هذة السلسة إن شاء الله على فهم آلية عمل ِ ASP.Net ولن نخوض فى شرح كيفية إستخدام أداة . بل سنشرح كيف تعمل هذة الأداة . ولن نتطرق إلى إنشاء صفحة والعمل عليها, بل سنشرح إن شاء الله دورة حياة هذة الصفحة وكيفية إدارة الحالة الخاصة بها, أى سنعرف كيف تجرى الأمور . وهكذا النهج ,سيكون , فهم ما وراء المشهد , إن أسهل شئ يمكن ان تعرفه هو كيف تكتب كود لتستخدم به اداة ما . ولكن من الصعب أن تعرف المشاهد الخلفية وراء ما قمت بعمله. والله الموفق .

مقدمة:

تطوير مواقع الإنترنت , امر هام هذة الأيام ,ولاقى إهتمام الكثيرين , فأصبح فى تطور مستمر ,ولعل من أقوى أوادت تطوير مواقع الإنترنت هى ASP .Net . والتى تقدمها شركة مايكروسوفت .كبيئة رائعة , توفر العديد من المزايا التى تتيح لك كمبرمج أن تنشأ موقع غنى تستطيع به إرضاء الكثيرين .ومن اجل هذا كانت هذة المقالة لتساعدك على فهم ASP. Net وآلية العمل المستخدمه فيها وكذلك بعضاً من مزايها , و ما أوصيك بالتركيز عليه هو أن تفهم ما وراء المشهد” .

ما هى ASP .Net ؟

ASP. Net ليست لغة برمجة , ولكنها بيئة برمجية لإنشاء وبناء مواقع إنترنت . وهى أداة رائعة لديها ما يجعلك دائماً منبهراً , بل ومغرماً بها .فقد قدمت لك ما يوفر الوقت والجهد فى بناء موقع جذاب, وليس هذا فحسب , بل قدمت لك المزيد من التحكم فى موقعك من حيث البناء والإختبار والنشر للعالم الخارجى وكذلك الإدارة فى أى مرحلة كنت .

تقف ASP. Net على ثلاثة أعمدة هما :

  • Postbacks

  • ViewState

  • Server Controls

سنعطى تعريفات شبه مختصرة لإن التفصيل سيأتى في النقاط المتتالية إن شاء الله :

  • PostBacks : رحلة طلبك لتحديث صفحة ما, بداية من الضغط على Button (مجرد مثال)لتذهب إلى الخادم , ومن ثم العودة بالتحديثات , ليتم عرض الصفحة المحدثة فى متصفح المستخدم . والتعريف المختصر : “رحلة الطلب من المتصفح إلى الخادم ثم العكس “, ستجدها فى الإنجليزية بإسم “Round Trip” والترجمة ذهابا وإياباً“.

  • ViewState : حالة التطبيق , كما ذكرنا فى تعريف PostBack , فإن هناك ذهاباً وإياباً, وإليك هذة الحقائق :الصفحة بمثابة عمل Instance من Class ,يتم تدمير هذا الــ Instance فى كل مرة تبدأ هذة الرحلة (Postback ) وبالتالى كل الخصائص التى تم ضبطها فى هذا الـ Instance قد ذهبت مع الريح ,ويتم إعادة إنشائه مرة أخرى ليتم إستخدامه فى العودة للصفحة , وبالطبع ستكون قيم خصائصه هى القيم الإبتدائية ,وليست القيم الجديدة التى قام المستخدم بإختيارها , لذا وجب علينا أن نحتفظ بالقيم الجديدة فى مكان ما, لنعيد إنشاء الصفحة بهذة القيم لتظهر وكأن عملية التدمير وإعادة الإنشاء لم تتم .ومن أجل هذا الغرض جاءت ViewState .

  • Server Controls : هى أداوت صممت خصيصاً لتتفاعل مع الخادم .والأمر الذى يميزها أنها Server Controls هى الخاصية Runat , ولاشك انها تتمتع بالعمل تلقائياً مع ماتم تعريفه مسبقاً بـ ViewState, أى قابلة لحفظ حالتها بإستخدام ViewState . ولا نغفل ذكر أمراً جيداً , وهو , إن من هذة الأداوت من يوفر لك الوقت والجهد وكذلك الكفاءة ,كأدوات التحقق من صحة البيانات المدخلة. هذة الأدوات التى تقوم بتوليد اكواد مساعدة لها صممت بواسطة JavaScript , لتقوم بعمل كان يحتاج منك الكثير والكثير . وأيضاً لا ننسى أداوت ما يعرف بـ Membership . فـ ASP . Net توفر لك أدوات تستطيع من خلالها ان تزود موقعك بمزيد من الخصوصية كتسجيل المستخدم دخوله للموقع وكذلك تسجيل عضو جديد وأشياء من هذا القبيل . الحقيقة لا تكفى مقدمة زهيدة كهذة للحديث عن الأدوات وما يتعلق بها فى ASP. Net , فقد نفرد لها كتاباً مستقلاً إن شاء الله.,وسيأتى تفصيلاً لكيفية عمل هذة الأدوات فيما بعد .

فعلى هذة الثلاثة تم بناء ASP. Net : أدوات تدعم كلاً من PostBack , ViewState . هذا هو كل شئ , فعند تصميم صفحة ما فى موقع . نجد الأمر قد بات واقعا محسوساً ,فهيا نرى مما تتكون الصفحة أو بالأحرى الموقع , لإن الموقع الواحد يتكون من صفحات ,وهذة الصفحات تم إنشاؤها بإستخدام هذة البيئة(ASP. Net ) , وتجد ان الصفحة الواحدة ماهى إلا ملف بإمتداد .aspx , له تركيبته الخاصة والتى تميزه عن ملفات أخرى مشابه له .وسنتعرف على هذة التركيبة فيما بعد إن شاء الله .

ولكن لعل من المهم الآن ان تعرف أن محتويات هذة الصفحة تتكون من كود يسمى aspx Code. وهو عبارة عن أداوت تم إنشاؤها لتشكل فى النهاية الصفحة المراد إنشاؤها, وهذة الأداوت يطلق عليها إسم Server- Controls والترجمة أداوت الخادم وقد تقدم ذكرها . وهذا لا ينفى إحتواء الصفحة على أدوات أخرى والتى يطلق عليها HTML Controls .ومن الجدير بالذكر الآن أن تضع فى ذهنك أن المتصفح (Web Browser) الذى هو المسئول الأول والأخير عن عرض صفحات الإنترنت , لايفهم إلا لغة واحدة وهى HTML . ومثال على هذة المتصفحات مثل (Internet Explorer /IE – Firefox- chrome – Opera,Safari ,غيرها ).

ألا يوجد هناك تضارب!! , كيف نستخدم أداوت Server Control وهى aspx Code والتى لا يفهما المتصفح ! . فكيف سيتم عرضها للمستخدم ؟!.فى الحقيقة هذة الأدوات يتم تحويلها إلىHTML فى وقت التشغيل(Run-time ) . وهذة العملية يطلق عليها إسم Rendering .

ملحوظة: قد يوجد فى الصفحة أيضاً اكواد C# او Vb. net للتفاعل مع الخادم , او ربما كود JavaScript لإعطاء ردة فعل سريعة إستجابة لإختيارات المستخدم. أو قد يوجد هناك اكواد CSS لتنسيق عناصر الصفحة ونقصد بالعناصر هنا المكونات.ولكن ليس بالضرورة ان يتواجد الكل فى صفحة واحد ,فقد يتواجد كلاً منهم فى صفحة مستقلة .فالأمر يعود إلى إختيارك.

ما هى HTML ؟

هى إختصار (Hypertext Markup Language ). وهى لغة مكونة من رموز تتشكل بها صفحات الإنترنت , فالخانة التى تراها وتستطيع أن تكتب فيها إسمك او عنوانك أو حتى بريدك الإلكترونى تسمىTextbox , والرمز أو الأداة التى تمثل الرابط الذى تراه وتسطيع الضغط عليه يذهب بك إلى مكان آخر سواء صفحة أخرى او موقع آخر أو تنتقل إلى مكان آخر فى نفس الصفحة يسمى anchor .فعند الحاجة لإظهار رابط للمستخدم يذهب به إلى محرك البحث Google فإننا نستخدم التالى :

<a href=”http://www.google.com&#8221; title= “go to google”>Google</a>

فهنا نجد ان كلمة Google ستظهر للمستخدم وكلمة go to googleستظهر عندما يقف بالمؤشر على الرابط. وبالفعل سيذهب بالمستخدم إلى الرابط المرفق بالأعلى وهو محرك البحث جوجل وذلك عند الضغط على الرابط . وهذا بعض الشئ من قدرات HTML.

فنأتى هنا لتعريف لهذة اللغة (HTML) فى جملة واحدة : “هى لغة تصميم صفحات إنترنت“. ولكن حين نتكلم عن صفحة إنترنت مصممة فقط بـHTML , فإننا نتحدث عن صفحة ثابتة المحتوى ولا تتغير, يطلق على هذا النوع من الصفحات Static Pages .ونقصد هنا بإنها لا تتغير أى أن محتواها لا يتغير ,فسيكون المحتوى هو نفس المحتوى الذى سيراه المستخدم عند كل زيارة إلا إذا قام المصمم بتغير محتوى الصفحة من جديد.

أما النوع الآخر من الصفحات هو Dynamic Pages وهو الذى جاءت من أجله ASP. Net , حيث يستطيع فيها المستخدم التحكم فى شكل الصفحة , ويمكنه أيضاً التعامل مع قواعد البيانات لإرسال وإستقبال بيانات من وإلى الخادم .وتوفير المزيد من الحماية لخصوصية الموقع , والعمل على توفير قدر كبير من العمليات الإدارية لصفحات الموقع من فحص وإختبار وتتبع الأخطاء وإصلاحها والتعامل مع الذاكرة و غيرها المزايا الكثير الكثير التى تقدمها لك ASP. Net .ويتم هذا التفاعل من خلال إرسال وإستقبال طلب للخادم يعرف فى الإنجليزية بإسم HTTP Request .

HTTP Request

دعنا نلقى الضوء على HTTP قبل كل شئ ,بدايةً هو إختصار “Hypertext Transfer Protocol ” وهو إتفاقية لنقل النصوص المتشعبه , وأتى مع ظهور WWW وهى World Wide Web . وياتى له تعريف بإنهالمستندات المرتبطة ببعضها على الإنترنت” .فيمكن ان نعطيه تعريف بإنه وسيلة الإتصال بن جهاز المستخدم و الخادم ويستخدم بعضاً من الأوامر التى يستطيع ان يفرق بها بين نوعية الطلب القادم إليه ليتفاعل مع كل طلب بما يتوافق معه , ومثال هذة الأوامر مثل GET , POST وغيرهما , ولكن هما ما يتم إستخدامها فى ASP. Net .

GET and POST

فالأول GET , و يستخدم عند طلب الصفحة لأول مرة وهو لعرض القيم الإبتدائية للصفحة , ليمر هذا الطلب بعدد من المراحل , يزداد هذا العدد فى الطلبات المتتالية لنفس لصفحة, ولكن عندها سيكونطلب الصفحة بإستخدام الأمر POST , وياخذ هذا الأمر طريقه فى الذهاب إلى الخادم عند إعطاء المستخدم الأمر بذلك, ليقوم بتنفيذ حدث ما تم إعداده خصيصاً ليكون بمثابة ردة فعل لما قام المستخدم بفعله , بالطبع لا يعرف المستخدم انه قام بعمل POST ,ولن يجد ذلك مكتوباً أمامه.لكنه قام بالضغط على Button , او قام بإختيار شئ ما, يتطلب الذهاب إلى الخادم لتحديث حالة التطبيق .

ملحوظة: حالة التطبيق نقصد بها هنا المحتويات وما تم التعديل فيه وأيضاً ما يترتب على هذا التعديل . على سبيل المثال, إختيار المستخدم عرض الهواتف المحمولة من قائمة لديه فى الصفحة, ليظهر له جدول به كل الهواتف المتاحة. فهل من المنطق ان يختار عرض السيارات ونظل نحن نعرض له قائمة بالهواتف , فكان لابد من تحديث حالة التطبيق ليعرض له التحديثات ,فوجب علينا ان نعود إلى الخادم ليمدنا بالتحديثات ومن ثم عرضها للمستخدم , وتسمى رحلة الذهاب والإياب بـإسم Postback . وبعد هذة الرحلة يتم تحديث حالة التطبيق.

ملحوظة: إذا تحدثنا عن GET , POST فى مكان آخر وليكن PHP ,سيدور الحديث بشكل مختلف. فقد تكلمنا عما يخص ASP. Net وأهملنا جوانب اخرى تخص هذين الأمرين.

ملخص هذا الكلام: قد عرفت ان الطلب الأول للصفحة الواحدة يكون بإستخدام الأمر GET والأوامر المتتالية لنفس الصفحة تكون بإستخدام الأمر POST .

المستخدم والخادم

لابد أن تفهم جيداً آلية عمل كلاً منها قبل ان تبداً الغوص بداخل تطوير المواقع بإستخدام ASP. Net ,و هذابدوره سيعطيك فهماً عميقاً إن شاء الله .

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

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

ألا يعتبر هذا إهداراً لموارد النظام من إشغال للمعالج وكذلك الذاكرة .ولكن لماذا نضطر إلى العودة إلى الخادم ؟ , حسناً , سأجيب على هذا السؤال بالتالى: هل تذكر أنك وضعت قاعدة البيانات على خادم فى مكان ما ,فكيف يمكن للمستخدم المقيم فى الجهة الأخرى أن يعرف ما هى رحلات الطيران المتوافر فيها أماكن للحجز عند تعامله مع تطبيق قمت بعمله لشركة طيران عالمية 🙂 . ففى هذة الحالة , وجب أن يرسل المستخدم إلى الخادم طلباً بالبيانات المراد الإستعلام عنها, وهى على سبيل المثال, إسم أو رقم البلد المتجه إليها العميل , وكذلك التى سيغادرها . فيرد عليه الخادم بأرقام الرحلات ومواعيدها والتكلفة المالية. فهنا كانت الحاجة ملحة للخوض الرحلة لتحديث الصفحة .ولمساعدة العميل فى إيجاد ما يريد .ونتمنى له رحلة طيبة 🙂 .

Ajaxجاءت لتنقذ الموقف

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

,أليس من المنطقى أن يتم إرسال الجزء المراد تحديثه فقط .ويتم ترك باقى الصفحة كما هو ؟! .بلى , ولكنفى الشكل الطبيعى هذا غير جائز . فكان ظهور Ajax ظهور المنقذ , تلك التقنية التى تعتمد على JavaScript بالعمل مع XML لإرسال وإستقبال HTTP Requests , فى الواقع يعرف بـإسم XMLHTTPRequest . وهو HttpRequest قائم على XML فى عملية الإرسال والإستقبال . والتى تتولى عملية الإرسال والإستقبال هى لغة JavaScript لتقوم بدورها بتحديث عناصر الصفحة التى هى بالفعل HTMLبعد عملية الإستقبال.إذاً فهى تقوم بتحديث كود HTML .

هرع الكثير من المبرمجون إلى العمل مع مكتبة Ajax ,التى تقدم العديد من المزايا التى تهدف فى المقام الأول إلى مصطلح “Partial Update ” والترجمة هى التحديث الجزئى ” .تشمل هذة المكتبة ما يعرف بـ Namespaces , Classes , Events , والتى تقدم سهولة التعامل مع العديد من المزايا الخاصة بـ ASP. Net مثال ذلك: تحديد الهوية Authentication , وكذلك الإعدات الشخصية Profiles وكذلك التعامل مع خدمات الويب Web Service , وتدعم كذلك العمل مع نظام المجموعات وهو ما يعرف إنجليزياً بـ Roles , ولا ننسى التعامل مع تعدد اللغات وهو ما يعرف بإسم Globalization . وليس هذا فحسب . جاءت كذلك بعض الأدوات المصاحبة لهذة المكتبة وهى ما باتت تعرف بـإسم Ajax Sever Controls ومجموعهم خمسة أداوت : ScriptManager , ScriptManagerProxy , UpdatePanel ,UpdateProgress, Timer . وهذة الأدوات أصبحت جزءاً داخلياً من الإصدارت الحديثة لبيئة التطوير الخاصة بـ ASP. Net .

برع أيضاً الكثير من المطورون فى إستخدام هذة المكتبة فى إعداد الكثير من الأدوات الفعالة, التى تقوم فى الأساس على تقنية Ajax , ومن هنا جاءت لنا أدوات باتت تعرف بإسم Ajax Control Toolkit . وهناك الكثير منها , حتى إن بإمكانك أن تقوم بعمل أداتك الخاصة التى تفى بإحتياجاتك . هذا فقط بعد أن تتعلم كيف تعمل هذة المكتبة وكيف تستخدمها.

كانت هذة نبذة سريعة على Ajax ولن تحتاج إلا لمعرفة وفهم المصطلحات التى ذكرت من قبل وكيفية التعامل أيضاً مع المكتبة والأدوات معاُ .

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

هندسة صفحة ASP. Net

تامل هذة الصورة :

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

الجهة الأولى :

,ومنه فإنك ترى أن نظام التشغيل الذى يلزمك لتستطيع العمل على ASP. Net هو النظام الخاص بـ Microsoft المعروف بإسم Windows , ويتم تثبيت .Net framework وكذلك الأداة التى تمكنك من إنشاء تطبيقات ASP.Net وهى Visual Studio , أو طبعة أخرى تسمح بإنشاء مثل هذة التطبيقات , نجد أيضاً أنه يجب تثبيت برنامج الخادم IIS .على هذا النظام .

ملحوظة: كان تثبيت IIS لابد منه قبل إصدارات 2005 , ولكن لم يعد ذلك واجباً عليك , لوجود خادم داخلى تحت مسمى localhost بعد ان كان إسمه حين إصداره Cassini , ولكن ضع فى إعتبارك ان هذا الخادم الداخلى يعمل فقط فى بيئة التطوير , أما إذا إحتجت ان تنشر موقعك ليراه القاصى والدانى فلابد لك من IIS .

الجهة الأخرى:

نجد من الرسم أن المستخدم يقوم بطلب صفحة من تطبيق ASP. Net وحيث ان هذا التطبيق مثبت على خادم IIS فإن هذا الخادم هو من يقوم بفحص هذا الطلب ليقوم بعد ذلك لتسليمه إلى .Net frameworkالمثبت على نظام التشغيل windows .ليصلك فى النهاية مخرجات الصفحة على هيئة HTML .

فى بعضاً من التعقيد هيا لنرى رحلة طلب الصفحة بداية من خروجها من جهاز العميل إلى نهاية المطاف .

يخرج أمر طلب الصفحة من جهاز المستخدم ,ليأخذ طريقة إلى المستضيف وبه نجد برنامج الخادمIIS , ليقوم بفحص الطلب القادم , .ومن ثم تسليمه إلى ASP.Net Worker Process وهى المسئولة عن معالجة الـRequest أو ما أطلقنا عليه إسم “ الطلب ”. ليتم التسليم إلى ASP.Net Runtime ,ومنه يتم إنشاء Instance من HttpContext لتحتوى بدورها عن كل المعلومات التى تحتاج ان تعرفها عن هذا الطلب (Request) .ويقوم Runtime أيضاً بإنشاء Instance من HttpApplication المتمثل فى الملف الذى قمت بإنشائه تحت إسم global.asax , ليقوم هذا الـ Instance ببدء تنفيذ الأحداث الخاصة بة وهنا تبدأ دورة حياة التطبيق , بعدها يتم تنفيذ اى HttpModule , سواء كان من إعدادك او من إعداد ASP. Net , ليقوم بدور إجراء التعديلات على الطلب الحالى ,ثم بعد ذلك يصل الطلب (Request) إلى نهاية المطاف إلى HttpHandler , ويختلف تفاعله وردة فعله حسب الإمتداد القادم إليه ,ولعل أهمها وما نحن نصدد الحديث عنه هو ASP.Net Page او System.Web.UI.Page وما هى إلا Class تقوم بعمل Implement لما يعرف بـ IHttpHandler , نجد فيها دالة بإسمProcessRequest , داخل هذة الدالة يتم تنفيذ مجموعة من الأحداث والدوال الأخرى تتمثل فى دورة حياة الصفحة . وتكون هذة بداية إخراج محتوى الصفحة للمستخدم..وإليك هذا الرسم التوضيحى :

رحلة طلب المستخدم للصفحة من المتصفح إلى أن يصل إلى الصفحة المطلوبة

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

المصطلح

التعريف

HttpRequest

طلب المستخدم للصفحة .

IIS

الخادم المستخدم فى إستضافة تطبيقات ASP.Net

ASP. Net Worker Process

العملية المسئولة عن معالجة الـRequest .

ASP. Net Runtime

المسئول عن إدارة معالجة الـRequest . وهو جزء من ASP. Net Worker Process .

HttpContext

المسئول عن تجميع المعلومات الخاصة بالطلب الحالى (Current Request) .

HttpApplication

المسئول عن إدارة التطبيق أثناء وقت التشغيل.

HttpModule

هى أداة مساعدة وتقوم بتنفيذ بعض الوظائف من خلال أحداث HttpApplication وسنرد لها درس بإسم

“Handlers and Modules ”. لحاجتهما لمزيد من التفصيل .

HttpHandler

المسئول عن إدارة مخرجات الطلب . وهو نقطة الإستجابة للـRequest . ,ويسمى End point , وهو المسئول عن إنشاء HttpResponse . التفاصيل فى درس قادم .

العروض التقديمية لدورة فى Transact-SQL

السلام عليكم

بعد التحية للجميع , اما بعد

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

عدد الشرائح : 223 شريحة
أهم النقاط التى تناولها الشرح :
Database concept
DML -DCL-DDL
SELECT ,INSERT , UPDATE ,DELETE
Grouping
Operators
Relationship and Join Types
Transaction
Attach , Detach , Backup , Restore
Constraints
Scripts and Generating Scripts
Tables and Views
Stored Procdeure
Functions
Triggers

يلى هذا الموضوع إن شاء الله ملخص لكتاب مايكروسوفت 2071b باللغة العربية .حين الإنتهاء منه ,ليكون دعما ً آخر فى تعلم Transact-SQL والله المستعان .

التحميل من هــنــــــــــــــــــــــــــــــــــــــا

ولتحميل الكتاب من هنــــــــــــــــــــــــــــــــــــــــــــا

والسلام عليكم ورحمة الله

الجزء الثالث : الإتصال بدوال Server-Side من خلال Client-Side

السلام عليكم ورحمة لله
مقدمة :

تتمتع Jquery بطريقة عمل خاصة مع Server وكذلك قواعد البيانات بأنواعها من خلال دوال Ajax .مثال get ,Ajax,Post,Load,getjson,getscript

ما ستعرفه فى درس اليوم :
– العمل مع HttpHandler وإسترجاع بيانات منه .
– كيفية الحصول على كود Html لأى أداة أثناء وقت التشغيل من خلال العمل مع دالة RenderControl .
-نقل اداة من ملف لملف آخر .
– المزيد من Linq
– الخوض قليلا فى Jquery .

يمكنك رؤية باقى الدرس من هنا إلى حين إلإنتهاء منه ووضعه للتحميل إن شاء الله

والسلام عليكم وحمة الله.

الجزء الثانى : إستدعاء دالة Server-side من خلال Client -Side

السلام عليكم ورحمة الله

الجزء الثانى
العمل مع Web Service وكيفية العمل معها من خلال Ajax

للتذكير:
فى الدرس الأول تم التقديم لهذة الدروس على انها للأتصال بالـServer من خلال Client وذلك لمنع حدوث رحلة العودة من وإلى الخادم/العميل وهى ما نسمية PostBack مما قد يحسن أداء وجودة العمل مع الموقع الذى يعمل بهذة الطريقة فى الإتصال بقواعد البيانات .

يمكنك تحميل الدرس بصيغة PDF من هنــــــــــــــــا

المقدمة : هنا سنتعامل مع Web Service وكيفية العمل مع قواعد البيانات من خلال LINQ to SQL وكذلك فصل الأكواد عن بعضها البعض

الدرس :

لا تحتاج web service إلى الكثير من كتابة الأوامر حتى يتم الإتصال بها وتنفيذ امر ما . فهى نفس طريقة عمل PageMethods وهنا أقصد انه لابد من وجود Proxy كما أشرنا إليه فى الدرس السابق ولكن هذة المرة سيتم تقديم الدعم بما يعرف بــ Intel sense وستعمل مع web service وكانك تكتب كود C# او VB . كما بالشكل :

وذلك لإن Web service تدعم خاصية تسمى ScriptService والتى تسمح برؤية إسم
Web service class فى نطاق العمل مع اكواد JavaScript وبالتالى رؤية الدوال التى تم إنشائها داخل web service. وذلك عند تعريف ScriptService Attribute كما بالشكل :

وكما أشرنا إلى Proxy فسيتم إدراج الأوامر الخاصة به وإن شئت قل إدراج إعداداته بإستخدام أداة
Script Manager . وتعريف ملف Web service ضمن مجموعة Services التى تخدمها وتديرها هذة الاداة كما ترى بالشكل:

    <asp:ScriptManager ID="ScriptManager1" runat="server">
        <Services>
            <asp:ServiceReference Path="~/WebService.asmx" />
        </Services>
    </asp:ScriptManager>

وإذا ما أردت أن ترى أعدادت Proxy ما عليك سوا ان تقوم بتفعيل الخاصية
InlineScript = true ومن ثم رؤية View Source . كما بالشكل :

<asp:ServiceReference Path="~/WebService.asmx" InlineScript ="true"  />

ومنها إلى JavaScript لنستدعيها ونستخدم ما نريد من الدوال المعرفه بها . مثال ذلك الدالة الإفتراضية
HelloWorld . ونجد ان آليه العمل واحدة فى اننا نجد أن لدينا داليتن وهما onsuccess و onfailed .

مثال مبسط :


WebService.HelloWorld(onsuccessFunction , onFailedFunction );

فى حين أن هناك دالتين بالأسماء السابقة قد تم تعريفهما من قبل ويعودان بالنتائج لعرضها .
فنجد أن :
WebService >> إسم Class المعرفه فى ملف Web Service .
HelloWorld <> دالة توجد فى نفس الملف فى كود JavaScript أو ملف منفصل كما سنرى وتعمل على إستقبال النتائج من الدالة HelloWorld فى حالة نجاح عملية الإتصال.
onFailedFunction >> دالة توجد فى نفس الملف فى كود JavaScript أو ملف منفصل كما سنرى وتعمل على إستقبال النتائج من الدالة HelloWorld فى حالة فشل عملية الإتصال .

إليك تمرين :

النتائج التى سنحصل عليها من التمرين :

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

مبدئياً سنعمل على فصل الاكواد عن بعضها فى ملفات منفصلة فسيكون لدينا ثلاث ملفات :
– ملف Web service .
o وبه سنجد عملية الاتصال بقاعدة البيانات من خلال إستخدام LINQ to SQL
 دالتين : احدهما لعرض بيانات فى DropDownList والآخرى لعرض التفاصيل.
– ملفات التعامل مع قاعدة البيانات Linq to Sql .
o يتم إدراج جدول واحد لتيسير العمل فى هذا الدرس وهو جدول Categories من قاعدة البيانات الشهيرة Northwind .
– ملف صفحة ASPX
o بها اداة بالطبع أداة ScriptManager وكذلك DropDownlist وأيضاً Div ليكون هو المساحة المستخدمه لعرض التفاصيل .
– ملف Js
o بها pageLoad Event ويعمل هذا الحدث كـحدث onload للصفحة ويعمل فى حالة وجود ScriptManager لإنه من الأحداق التى تقدمه Ajax Life Cycle .
o أيضاً به دالتين :
 الأولى : الإتصال بـWebService ومن ثم عرض النتائج فى DropDownList.
 الثانية: الإتصال بـ WebService ومن ثم تمرير Parameter إليها والعودة بالبيانات التى تم إختيارها بناءاً على ما تم تمريره .


العمل فى خطوات :
1- قم بإنشاء صفحة aspx وضع بها DropDownlist وكذلك div وسترى المحتويات بالكامل بالأسفل.
2- قم بإختيار Linq to SQl وأدرج بها الجدول الذى تريد العمل معه .
3- قم بإنشاء Web Service وأنشئ بها دالتين ستجد التركيب الخاص بهم فيما يلى .
4- قم بإنشاء ملف Javascript وبه سنضع حدث pageLoad وكذلك دالتين لمحادثة web Service.
5- قم بضبط Script Manager من حيت تعريف ملفات scripts وكذلك ملفات Services .

والآن مع تركيب الملفات المستخدمة فى هذا التمرين :

صفحة .aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="WebServiceTest.aspx.cs" Inherits="WebServiceTest" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server">
        <Services>
            <asp:ServiceReference Path="~/WebService.asmx" />
        </Services>
        <scripts>
            <asp:ScriptReference Path="~/WebServiceScript.js" />
        </Scripts>
    </asp:ScriptManager>
    <div>
       <br />
       <asp:DropDownList ID="CategoriesDDL" runat="server" 
                          onchange ="GetDetails(this);" >
        </asp:DropDownList>
        <br />
    </div>
    <br />
    <div id="SomeDiv">
    </div>
    </form>
</body>
</html>




ملفات LINQ to SQL
بعد إدراج جدول Categories

كما سترى فى ملف WebService التالى إستخدام هذا الجدول لعرضه فى DropDownlist .
ملف WebService.asmx


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;

/// <summary>
/// Summary description for WebService
/// </summary>
[WebService(Namespace = "http://mySite.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// To allow this Web Service to be called from script, using ASP.NET  //AJAX, uncomment the following line. 
[System.Web.Script.Services.ScriptService]
public class WebService : System.Web.Services.WebService {

    public WebService () {
        //Uncomment the following line if using designed components 
        //InitializeComponent(); 
    }

    [WebMethod]
    public List<Category> GetCategoriesByID(int SelectedCategoryID)
    {
        DataClassesDataContext dc = new DataClassesDataContext ();
        var query = from q in dc.Categories
                    where q.CategoryID == SelectedCategoryID
                    select q;
        return query.ToList<Category>();
    }

    [WebMethod]
    public List<Category > GetCategoryName()
    {
        DataClassesDataContext dc = new DataClassesDataContext();
        var query = from q in dc.Categories
                    select q;     
        return query.ToList<Category>();
    }
}


ملف WebSeriveScripts.js

function pageLoad() {
      FillDropdownlist();
}

// Fill Drop Down list 
function FillDropdownlist() {
    var DDl = document.getElementById("CategoriesDDL");
    WebService.GetCategoryName(function (data) {
        for (var i = 0; i < data.length; i++) {
            var myoption = new Option(data[i].CategoryName, data[i].CategoryID);
            if (DDl != null) {
                DDl.options.add(myoption);
            }
            else {
                alert("I have an Erro in DropDownlist Method");
            }
        }
        GetDetails(DDl);
    },
    function (err) {
        alert(err.get_message());
    });
}

// Fill FillGridView list
function GetDetails(obj) {
    var SomeDiv = document.getElementById("SomeDiv");
    var val = obj[obj.selectedIndex].value;
    WebService.GetCategoriesByID(val, function (result) {
        SomeDiv.innerHTML = "<span><b>Category ID </b>: " + result[0].CategoryID + "</span><br/><span><b>Category Name </b>: " + result[0].CategoryName + "</span>";
    },
     function (err) {
         alert(err.get_message());
     });
 }

إن واجهك شئ غامض فى الملفات السابقة قم بالعودة إلى أعلى لترى الوصف لهذة الملفات .

إلى هنا إنتهى الجزء الثانى مع AJAX .

تنفيذ دالة Server –side من خلال كود Client Side بإستخدام Ajax و JQuery الجزء الأول

تنفيذ دالة Server –side من خلال كود Client Side
بإستخدام Ajax و JQuery
الجزء الأول

الهدف من الدرس :
تجنب عمل PostBack للصفحة بأكملها .أو بصيغة أخرى : تحديث جزء من الصفحة دون الرجوع بكامل الصفحة إلى الخادم Server .

المقدمة :
فى هذة السلسلة سنتعرف على كيفية تنفيذ دالة معينة قد تكون فى ملف منفصل code Behindأو صفحة aspx أو حتى Web Service أو ربما HttpHandler من خلال إستدعائها بإستخدام Client Side Code . سنمر خلال هذة السلسلة بوظائف عديدة تقدمها Ajax وJquery مروراً بمجموعة من الدوال الشيقة التى ستوفر علي المستخدم ضياع الوقت فى الإنتظار حتى يتم الإتصال بالخادمServer ومن ثم الرجوع بالنتيجة وعرضها على الصفحة مما قد يسبب فى قلة جودة الأداء فى العمل مع الموقع . لذلك كوننا سننفذ هذة العملية من خلال client Side فلا حاجة لعمل PostBack وذهاب الصفحة بأكملها والعودة مرة أخرى بالبيانات الجديدة ولكن فقط سنتصل بالخادم ونرجع بالبيانات فقط ومن ثم عرضها للمستخدم دون أن يشعر أن هناك إتصال بالخادم .ومما لا شك فيه ان هذا Best Practice .

لمتابعة بقية الدرس يمكنك تحميل ملف الدرس من هنــــــــــــــــــــــــــا

أو رؤيته على أحد المنتديات العربية هنـــــــــــــــــــــــــا

والسلام عليكم ورحمة الله
أحمد

مقدمة لا بأس بها عن ASP.Net بالإنجليزية والعربية

السلام عليكم ورحمة الله

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

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

هنــــــــــــــــــــــــــــــــــــــــــــــــــــــــا

السلام عليكم ورحمة الله

ما يقرب من 1000 عرض تقديمى خاص بـ ASP.Net

السلام عليكم ورحمة الله

عروض تقديمية متنوعة من جامعات وأفراد واماكن مختلفة مجانية

هنــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــا

يسر الله لكم .

خلاصة المصادر التعليمية المجانية فى ASP.Net

السلام عليكم ورحمة الله

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

ومنذ ذلك الحين وأفكر فى وضع هذا الموضوع ولكن أتشاغل وأنسى .

وقد وجدت خلال رحلة البحث مصادر كثيرة لا تعد ولا تحصى . ولكن من أين أبدأ وما الجيد فيهم فأحترت بينهم . فمنهم منتدى ومنهم موقع لدروس ومنهم موسوعة ومنهم موقع لمرئيات وصوتيات ومنهم مصدر مفتوح لمشاريع ومنهم موقع لنشر أفكار او كما يسمونها حيل ونصائح Tips&Tricks وغيرهم الكثيييييييييييييييييييييير .

وقد رتبتهم لكم وأسأل الله العلى القدير أن يكون فى ترتيبهم فتحاً وفهما ً على من يقرأهم . وقد صنفتهم أيضاً فمنهم مقروء ومنهم مسموع ومنهم مرئى . فلم أجلب كل المصادر المجانية بل أفضلهم فلاحظ هذا .

وأبشرك انك لن تقرأهم كلهم سطراً سطراً أو كلمة كلمة بل سيأتى بك الحال ان تقرأ العنوان وتتخطاه لأنك لم تعد بحاجة لإعادته مرات أخرى . ولماذا هذا ؟ لإن المصدر الواحد إذا انهيته بفهم وحفظ فباقى المصادر كلهم إضافات وإعادة .

إذا كان الأمر هكذا ! لماذا لا نأخذ مصدر واحد فقط ؟ والجواب هنا , ان بعض المصادر ربما يقابلك شيئاً لن تستطيع فهمه ويسهل ذلك فى مصدر أخر .وذلك لإختلاف أسلوب العرض او لانه مفصل فى مصدر وقد أشير إلى إسمه فقط فى مصدر ثانى . وقد تغافل عنه فى مصدر ثالث .

المهم هنا يفضل ان تراعى الترتيب : ولماذا ؟ لإن ما وجدته معهم أن منهم من يتدرج من الأقل إلى الأعلى ومنهم من يسرد . ومنهم من هو عشوائى . فلذلك إحرص على الترتيب والله الموفق .

http://www.w3schools.com/aspnet/aspnet_intro.asp

http://quickstarts.asp.net/QuickStartv20/aspnet/Default.aspx

http://msdn.microsoft.com/en-us/library/ee532866.aspx
ثم تنتقل إلى المصادر المرئية

http://msdn.microsof…p/dd861531.aspx

http://msdn.microsoft.com/en-us/beginner/bb308760.aspx

http://www.asp.net/web-forms

ثم تعود إلى القراءة مرة أخرى

http://www.asp.net/learn/whitepapers

http://wiki.asp.net/

وللمصادر المفتوحة كادوات ومشاريع تريد أن تتعلم منها إليك ما يلى

أدوات

http://www.asp.net/community/projects

مصادر مفتوحة لكل ما تريد

http://www.asp.net/community/projects

http://www.codeplex.com/

ماذا أن وقف معك شئ أثناء العمل أو المذاكرة فعليك بالبحث , إتبع التالى :

-إذا أردت برنامج قم بالبحث عنه فى محرك البحث وليكن Google مثلاً أو غيره وإجعل لغة البحث إنجليزية , ولتكن بجواره كلمة Freeware . وإذكر إسم البرنامج وإن تعرف برنامج أو اداة محددة بعينها إذكر مجالها مثال

نريد برنامج محرر صور مجانى أو مصدر مفتوح مثلاً : فيمكن ان نجرب البحث بـ Graphic Program Free Ware فستجد أول نتيجة بحث برنامج يشبه PhotoShop ولكن هذا بلا مقابل .

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

وأوصيك بالذهاب مباشرة ً للبحث فى

http://msdn.microsoft.com

http://www.wikipedia.org

والسلام عليكم ورحمة الله