Saturday, March 17, 2007

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

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



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



1- غرفة ال IIS

> وعزمت في هذه الغرفة إلا أخرج إلا بعد أن أفهم الآتي :

> - نظرة عامة

> - ماذا يحدث تحت الغطاء



أما عن النظرة العامة

فهذه الغرفة هي المكان المختص باستقبال طلبات تشغيل صفحة ويب معينة والمسئول عن خدمة هذه الطلبات هو خادم Internet Information Services (IIS) وهو يعتبر الوسيط الذي لا غنى عنه بين المستخدم وبين موقع الانترنت وذلك لأنه يستطيع التعامل مع المستخدم وطلباته ويعرف كيفية الرد عليه بالأسلوب الذي يفهمه المستخدم وفي نفس الوقت قادر على التعامل مع ملفات موقع الانترنت بما يناسبها ونقل نتيجة تشغيلها إلي المستخدم ، ولا تقتصر خدماته على صفحات ASP.NET فقط بل تمتد إلي Classic ASP و HTML وأي تقنيه تدعم IIS وأولى ملاحظاتي على هذه الغرفة كانت كما يلي :

- لن يتمكن أي طلب لصفحة ويب من المرور إلا عن طريق توجيه طلبه إلي IIS وإلا فلا يمكن خدمته.

- ليس هناك إلا طريق واحد فقط لطلب تشغيل صفحة عن طريق IIS وهو ما يطلق عليه ال HTTP Request يكون محدد فيه عنوان الصفحة المستهدفة بالإضافة إلي معلومات أخرى.

- أي نتيجة تخرج من IIS إلي المستخدم يجب أن تخرج في HTTP Response يحتوى نتيجة طلب المستخدم

- تعمل جميع إصدارات IIS التي تسبق IIS 6.0 تحت اسم inetinfo.exe أما في حالة IIS 6.0 فأنه يعمل تحت اسم w3wp.exe



أما عن ما يجدث تحت الغطاء فكان كالتالي

يستطيع ال IIS تمييز الصفحات عن طريق الامتداد الخاص بها مثل .html .asp .aspx وبالتالي تغيير طريقة تعامله مع الصفحة بما يناسب التقنية المبنية بها، وتغيير طريقة تعامله هي أكثر من مجرد ثلاث كلمات لذا استوقفني قليلاً فقد سألت نفسي أربع أسئلة وهم كالتالي

1- ماذا لو ظهرت لغة جديدة ولتكن XSP لتطوير صفحات ويب فكيف سيغير IIS طريقة تعامله مع الصفحات المبنية بهذه اللغة وهو لم يكن يعرف بها من قبل

2- ما هي الخطوات التي يتبعها IIS لمعالجة طلبات تشغيل الصفحات المختلفة ؟

3- هل يستطيع IIS حجب بعض الصفحات أو الملفات عن المستخدم حتى وإن كانت موجودة عنده ؟ وهل يمكنني أن أضبطه بحيث يحجب ملفات خاص بي لا أرغب في أن يطلع عليها المستخدم ؟

4- كيف سيتصرف IIS إذا تعرف على امتداد صفحة وكان .aspx وعرف أنها ستعمل على ASP.NET وكان هناك نسختين مركبتين منها وهما ASP.NET 1.1 & ASP.NET 2.0



وإجابة السؤال الأول “ماذا لو ظهرت لغة جديدة ” كانت كالتالي

علمت مايكروسوفت أنها لن تستطيع أن توفر كل الدعم المطلوب لجميع لغات البرمجة الموجودة والمستحدثة لذا فقد طورت مايكروسوفت نظام Internet Server Application Programming Interface (ISAPI) Extension وهو نظام يهدف إلي إكساب IIS القدرة على توسعة إمكانياته ، بحيث يمكن لأي مبرمج تطوير ISAPI Extension جديد والحاقة بال IIS بحيث يكسب IIS القدرة على التعامل مع أنواع ملفات جديدة لم يكن ال IIS يعلم عنها شيئاً قبل ذلك، وأوضح الأمثلة العملية على ذلك هي ال ASP.NET نفسها فال.NET Framework أثناء تركيبه يلحق ISAPI Extension خاص بال ASP.NET وهو aspnet_isapi.dll بحيث يكسب ال IIS القدرة على معالجة الصفحات المبنية بتقنية ال .NET ويمكن توضيح الفرق قبل تركيب aspnet_isapi وبعد تركيبه وأثر تركيبه على IIS عن طريق الشكلين التاليين :



————————————————————————————————



لعل وظيفة ISAPI Extension تكون قد اتضحت الآن فهو من أكسب IIS القدرة على التعامل مع ملفات ASP.NET والوافد الجديد علينا في الشكل الثاني هو aspnet_wp وهو عبارة عن المحرك الرئيسي لتشغيل ASP.NET فكل ما يفعله aspnet_isapi بعد استلامه أمر تشغيل صفحة معينة أن يناول هذا الأمر إلي العملية المسماة ASP.NET Worker Process (aspnet_wp ) بحيث تتولى هي كل ما يلزم فعله حتى يتم خدمة هذا الطلب وسنتعرض لها بالتفصيل في المقالة القادمة إن شاء الله لأنها هي الغرفة الثانية التي تدخلها أي صفحة ASP.NET



أما عن “ما هي الخطوات التي يتبعها IIS لمعالجة طلبات تشغيل الصفحات المختلفة ؟” فإجابته كالتالي :

1- عن طريق HTTP Request يحدد IIS امتداد الصفحة المطلوبة سواء كان aspx , asp , html ويحدد أيضاً اسم الموقع الموجود به هذه الصفحة

2- يُعلم IIS جميع ال ISAPI Filters الملحقة به بوصول HTTP Request جديد ويمرر هذا الطلب على جميع المرشحات ISAPI Filters

3- يذهب IIS إلي ScriptMaps خاصة بالموقع المطلوب ويعرف من هذه الخرائط ال ISAPI Extension المناسب لتشغيل هذا الامتداد داخل هذا الموقع

4- يوجه IIS طلباً مباشراً إلي ISAPI Extension المستهدف بتشغيل الصفحة المرادة عن طريق أمر مثل هذا Http://Server_Name/MyISAPIExtension.dll?TargetURL

5- بعد استقبال نتيجة تشغيل الصفحة من ال ISAPI Extension يُعلم IIS جميع ال ISAPI Filters بأن هناك HTTP Response على وشك الإرسال إلي المستخدم ويمرره عليهم جميعاً

6- يرسل IIS نتيجة تشغيل الصفحة في HTTP Response إلي المستخدم





ولعل هناك تساؤل عن كلمتين جديدتين وهما ISAPI Filters و ScriptMaps وكل واحدة من منهما هي إجابة للسؤالين الثالث والرابع ، لذا لنستعرض كل سؤال



فالسؤال الثالث كان “هل يستطيع IIS حجب بعض الصفحات أو الملفات عن المستخدم حتى وإن كانت موجودة عنده ؟ وهل يمكنني أن أضبطه بحيث يحجب ملفات خاص بي لا أرغب في أن يطلع عليها المستخدم ؟”

فإجابة هذا السؤال هي نعم يستطيع IIS حجب ما يشاء من صفحات وملفات عن مستخدم بعينه أو حتى كل المستخدمين وذلك عن طريق ISAPI Filters فكما سبق توضيحه فإن أي HTTP Request & HTTP Response داخل أو خارج يمر على جميع ال HTTP Filters الملحقة ب IIS وإن قرر أحد تلك المرشحات أن يحجب النتيجة عن المستخدم فلن يتم إرسال أي نتيجة إليه ولا يمرر IIS طلب المستخدم دفعة واحدة على كل المرشحات بل يمرر الطلب على مرشح تلو الآخر على حسب الأولوية المسجل بها هذا المرشح وإن تساووا في في الأولوية فأنه يمرر على على حسب ترتيب تسجيل هذا المرشح داخل IIS وإن كان هناك حاجة لحجب محتويات معينة عن المستخدمين يمكن بسهولة أن نطور ISAPI Filter خاص بنا يتولى ترشيح الطلبات قبل وصولها إلي موقعنا ويمكن إضافة وحذف وتعديل ترتيب التسجيل لأي ISAPI Filter عن طريق هذه الشاشة



والتي يمكن الحصول عليها بإتباع المسار التالي

Control Panel > Administrative Tools > Internet Information Services > [Server Name] > Default Websites > Mouse Right Click > Properties > ISAPI Filters Tab

[Server Name] هو اسم الحاسوب المركب عليه IIS

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

*** عنوان قادم من المستخدم مكتوب فيه HTTP://www.MySite.com/MyPage.aspx/UserName/Ahmed يمكن للمرشحات أن تعيد كتابة العنوان بالشكل التالي

HTTP://www.MySite.com/MyPage.aspx?UserName = Ahmed وبالتالي سيأخذ IIS هذا العنوان الجديد ويناوله إلي ال ISAPI Extension المناسب لمعالجة هذا العنوان



*** المثال الآخر هو في حالة إرسال عنوان صفحة في HTTP Response فالطبيعي أن يكون العنوان المرسل إلي المستخدم كالتالي HTTP://www.MySite.com/YourPage.aspx وقد نحتاج إن لا نعلم المستخدم بالتقنية المستخدمة في تطوير الموقع فيمكننا عن طريق ISAPI Filter أن نعيد كتابة العنوان قبل إرساله إلي المستخدم ليصبح HTTP://www.MySite.com

ويمكن تلخيص وظيفة ISAPI Filters في هذ الشكل




ننتقل الآن لتوضيح ال ScriptMaps وفي نفس الوقت الإجابة على السؤال الرابع والأخير والذي كان “كيف سيتصرف IIS إذا تعرف على امتداد صفحة وكان .aspx وعرف أنها ستعمل على ASP.NET وكان هناك نسختين مركبتين منها وهما ASP.NET 1.1 & ASP.NET “

قبل أن يوجه IIS طلب المستخدم للتشغيل عليه أن يقرأ أولاً ال ScriptMaps الخاصة بالموقع الذي تعمل بداخله الصفحة المرادة لأن كل موقع له ScriptMaps توضح امتدادات الملفات المدعمة من قبله وال ISAPI Extension المناسب لتشغيل كل امتداد لذا فلو كان هناك موقعين يعملان ب ASP.NET ولكن لكل موقع إصدارة مختلفة من إصدارات ال ASP.NET فهذا يعني أن لكل موقع ScriptMaps مختلفة عن الآخر وهذا ما سيمنع تضارب تشغيل الصفحات بين الموقعين وعملية تسجيل هذه البيانات في ال ScriptMaps تسمى Script Mapping أو Application Mapping أيهما صحيح ويمكنك الإطلاع على ScriptsMaps الخاصة بكل موقع عن طريق هذه الشاشة



والتي يمكن الحصول عليها بإتباع المسار التالي

Control Panel > Administrative Tools > Internet Information Services > [Server Name] > Default Websites > [Any Web Site] > Mouse Right Click > Properties > Virtual Directory Tab > Configuration Button



أما عن ماذا يحدث بعد أن يوجه IIS أمر تشغيل مباشر إلي aspnet_isapi Extension وكيف يناوله aspnet_isapi إلي aspnet_wp.exe وماذا يحدث داخل aspnet_wp فهذا ما سنتعرف عليه في المقالة القادمة إن شاء الله “داخل غرفة aspnet_wp”

————————————————————————————————–

ملاحظة : —

على الرغم من الكلام في المقال أنصب على IIS فقط إلا أنه ينطبق على أي خادم ويب يدعم ASP.NET

Wednesday, March 7, 2007

ping server by programing

Form one month i'm design Ads with new technology but it's very heavy so that we separate this Ads in different server to protect our original server ok until now i'm don't have any problem but the problem was appear when mr:president request from me to test server that has Ads befor load from it because if it has problem we load on page different ads so
From two weeks or more I skim force internet to search How to solve this problem
but today i found alot of solution for this problem one with sql server but we don't have permission to do it . but I found the excellent solution with asp classic , C# ,VB i thing with any lang
this is solution with VB .net 2005 :
------------------------------------------------------------------
Public Function END_Ping(ByVal url As String) As Boolean
Dim objWShell As Object
objWShell = CreateObject("WScript.Shell")
Dim objCmd As Object
Dim strPResult As Object
objCmd = objWShell.Exec("ping " & url)
strPResult = objCmd.StdOut.Readall()
objCmd = Nothing : objWShell = Nothing
If InStr(strPResult, "TTL=") > 0 Then
Return True ' in corect
Else
Return False ' in error
End If
End Function

-------------------------------------------------
and this with asp classic

<% url = "www.yahdffdoo.com"
Set objWShell = CreateObject("WScript.Shell")
Set objCmd = objWShell.Exec("ping " & url)
strPResult = objCmd.StdOut.Readall()
set objCmd = nothing: Set objWShell = nothing
if InStr(strPResult,"TTL=")>0 then
Response.Redirect("http://www.googel.com") ' in error
else Response.Redirect("http://www.yahoo.com") ' in corect
end if %>

Thanks Allah for all thing