عضو مسجل ، قم بإنشاء قاعدة بيانات تطوير الويب الخاصة بك ، مقدمة
ASP.NET ليست ترقية بسيطة لـ ASP ، ولكنها جزء مهم من خطة Microsoft .NET. إلى نافذة برمجة Windows ، يوفر واجهة برمجة جيدة لتطوير وظائف تطبيق الشبكة الكبيرة ، ويمكن أن تحسن بشكل كبير من كفاءة عمل المطورين.
ومع ذلك ، فإن عملية "تحويل الوقت الواحد ، وعملية مجموعتين" تجعل ملف ASPX غير كافٍ بعض الشيء عندما يقوم التنفيذ الأول (أو العملية الأولى بعد التحديث) ، وخاصة في بيئة التطبيق لعدد كبير من ملفات رمز ASPX و CodeHind ، يتم ترجمة ملف ASPX الذي تم نشره بعد DLL (في .NET ، المعروف باسم مجموعة التطبيقات) ، مما يلغي وقت "تحويل واحد وتجميع واحد" ومعدل استخدام وحدة المعالجة المركزية ، مما سيحسن بشكل كبير الأداء العام لخدمات الويب. بالطبع ، بعد تجميعها في DLL ، تحسنت سرية رمز المصدر أيضًا إلى حد ما.
تقدم هذه المقالة عملية المعالجة الأساسية لـ ASP.NET وتحليل اكتشاف سري. "Trap" ، يجمع ملفات ASPX المتاحة مع ملف ASPX من CodeBehind في عملية DLL. في نهاية المقالة ، يتم أيضًا تقديم نصائح لعملية التشغيل الفعلية.
نظرًا لأن هذه المقالة تتضمن مفاهيم مثل تطبيقات ASP.NET ، وتجميع سطر الأوامر ، وملفات التكوين web.config ، وما إلى ذلك ، من أجل تمكين القراء من فهم محتوى هذه المقالة بشكل أفضل ، ولجعل هذه المقالة تبدو متشابكة ، بادئ ذي بدء ، فإن هذه المقالة تتوافق مع النظام المقابل لهذه المقالة.
بيئة النظام:
Win2000 (SP3) + IIS5 + .NET Framework 1.0 (الإصدار الصيني).
اسم الخادم:
نظرًا لأن أمثلة هذه المقالة يتم اختبارها على هذا الجهاز ، فإن اسم الخادم هو مضيف محلي.
إعدادات IIS:
إنشاء دليل افتراضي dlltest (المسار الحقيقي هو w:/wwwroot/dlltest) ، وقم بتعيينه كتطبيق لإنشاء دليل bin تحت dlltest. سيتم وضع جميع ملفات المصدر في دليل DLLTest ، وسيتم وضع جميع ملفات DLL في دليل DLLTEST/BIN.
ملف تكوين تطبيق ASP.NET -web.config
قم بإنشاء ملف Web.Config في دليل DllTest.
<نسخة XML؟
<simpion>
<system.web />
</configuration>
نافذة الأوامر (نافذة DOS)
افتح نافذة الأمر واستخدم الأمر CD لجعل الدليل الحالي كـ W:/wwwroot/dlltest.
1. إنشاء رسم خرائط من ASPX إلى DLL
بادئ ذي بدء ، دعونا نرى كيف تتم معالجة ملف ASPX بواسطة ASP.NET:
عندما يتم إرسال طلب HTTP (مثل "http: //webserver/webapp/webpage.aspx") من العميل إلى خادم IIS ، فإن IIS يلتقط ويحلل الطلب ، وعندما يحلل هذا الطلب كصفحة ASPX ، على الفور ، استخدم صفحة ASPX لاستخدام صفحة ASPX فورًا. WebApp/WebPaage.aspx "موجود. إذا لم يكن موجودًا ، فأعود إلى العميل والعودة إلى خطأ HTTP 404 (ملف غير موجود) ، وإلا ابحث عن ملف DLL المقابل في الدليل المؤقت لـ ASP.NET ، إذا لم يكن موجودًا أو أن DLL "قديم" من ملف مصدر ASPX ، اتصل بمترجم CSC (إذا كان البرنامج النصي لخدمة ASPX من البرنامج النصي الجانبي للخدمة في ASPX ، فإن اللغة هي VB أو JSCRID ملف ASPX في DLL ، ثم يقوم ASP.NET باستدعاء DLL للتعامل مع طلبات العملاء المحددة والعودة إلى استجابة الخادم.
يمكن أن نرى من عملية المعالجة هذه بشكل عام ، ستقوم بيئة تشغيل ASP.NET تلقائيًا بتحديد DLL وتحديثها المقابل لـ ASPX. فهل هناك أي طريقة أخرى لفرض معالجة "الطريق" على ملف ASPX إلى DLL المترجمة؟ تتمثل الطريقة في إضافة ASPX إلى عناصر تعيين DLL في قسم httphandlers في قسم System.Web من قسم System.Web في تطبيق ASP.NET.
<dd verb =* path = aspx name type = class name ، dll file/>
ملف ASPX: مطلوب الاسم الظاهري لـ "التوجيه" ، ويجب أن يكون الامتداد ASPX ، وإلا فإن IIS ستعالج الملف أولاً في بيئة تشغيل ASP.NET.
ملف DLL: ملف DLL (مجموعة التطبيق) ، لا حاجة للدخول ".dll". يبحث ASP.NET أولاً عن DLL التجميع في تطبيق التطبيق لتطبيق التطبيق ، ثم يبحث في DLL التجميع في ذاكرة التخزين المؤقت لتعيين النظام.
اسم الفصل: نظرًا لأن DLL قد يكون له أسماء متعددة أو فئات متعددة ، يجب تحميل الفئة تلقائيًا عند استدعاء DLL.
على سبيل المثال ، ملف web.config لتطبيق ASP.NET معين كما يلي:
<نسخة XML؟
<simpion>
<stystem.web>
<httphandler>
<dd verb =* path = index.aspx type = bbs.indexpage ، bbs />
</httphandler>
</ssystem.web>
</configuration>
يخبر ملف التكوين ASP.NET أنه عندما يطلب العميل ملف index.aspx لهذا التطبيق ، يستدعي مباشرة bbs.dll في دليل صندوق التطبيق ، ويقوم تلقائيًا بتحميل فئة bbs.indexpage.
2. يمكن للتطوير التعامل مع DLL لصفحة HTML
تجدر الإشارة إلى أنه لا يمكن لجميع التطبيقات DLL تنفيذ وضع طلب/استجابة HTTP. دعونا نلقي نظرة على وصف "برنامج معالجة HTTP ومصنع" في برنامج Microsoft ASP.NET Fast Entry Tutorial (http://chs.gotdotnet.com/quickstart/aspplus/):
يوفر ASP.NET طلبات منخفضة المستوى/واجهات برمجة التطبيقات للاستجابة ، مما يمكّن المطورين من استخدام فئة .NET Framework لتوفير خدمات لطلبات HTTP التي تم تقديمها. تحقيقًا لهذه الغاية ، يحتاج المطورون إلى إنشاء فئة تدعم واجهة System.Web.ihttphandler وتنفيذ طريقة ProcessRequest (). عند معالجة طلب HTTP ، لا تتطلب الخدمة التي يوفرها إطار الصفحة عالية المستوى ، عادةً ما يكون برنامج المعالجة مفيدًا. تشمل الاستخدامات الشائعة لبرامج المعالجة أجهزة الشاشة والتطبيقات المشابهة لـ CGI ، وخاصة التطبيقات التي تُرجع البيانات الثنائية.
يتم أخيرًا معالجة كل طلب من طلب HTTP الذي تم استلامه بواسطة ASP.NET بواسطة مثيل محدد للفئة التي تنفذ ihttphandler. يوفر ihttphandlerfactory هيكلًا يعالج التحليل الفعلي لطلب عنوان URL على مثيل IHTTPhandler. بالإضافة إلى فئة ihttphandlerfactory الافتراضية التي توفرها ASP.NET ، يمكن للمطورين أيضًا اختيار إنشاء المصانع وتسجيلها لدعم عدد كبير من حلول تحليل الطلبات وتفعيلها.
يمكن أن نرى من هذا النص أنه عندما لا تتضمن صفحة ASPX تقنية الواجهة المتقدمة التي يوفرها .NET Framework (مثل ذاكرة التخزين المؤقت للبيانات ، مرجع التحكم في نافذة الويب ، وما إلى ذلك) ، وخاصة عند إرجاع البيانات الثنائية (مثل هذه البيانات الثنائية (مثل هذا كصور ، أصوات ، إلخ) للعميل ، يمكنك استخدام ملف تطبيق .CS (باستخدام لغة C#هنا ، إذا كنت تستخدم VB أو JScript ، ...) والتطبيق يجب أن يكون لدى البرنامج فئة للتنفيذ System.Web.ihttphandler واجهة وتنفيذ طريقة ProcessRequest (). مثال بسيط هو كما يلي:
/* ملف المصدر: ex1.cs يبدأ*/
باستخدام system.web ؛
مساحة الاسم dlltenst
{{
/*
يجب أن ينفذ الفصل واجهة ihttphandler. إذا كان البرنامج سيصل إلى حالة الجلسة ، فيجب تنفيذ واجهة IrequiressessionState (واجهة العلامة التي لا تتضمن أي طريقة).
*/
الطبقة العامة ex1page: ihttphandler
{{
/*
يخبر IsReusable Attribute إطار .NET بأن هذا البرنامج يمكن استخدامه بواسطة مؤشرات ترابط متعددة في نفس الوقت.
صحيح يتوافق.
*/
منطقي عام لا يمكن
{{
احصل على {return true ؛}
}
/*
قم بتنفيذ طريقة ProcessRequest وإرجاع بيانات الاستجابة إلى العميل.
في هذا المثال ، أعد صفحة HTML بسيطة إلى العميل
*/
Public Void ProcessRequest (سياق httpcontext)
{{
httpresponse res = context.Response ؛
Res.Write (<html> <body>) ؛
Res.Write (<h1> dlltest -ex1 (مثال 1) </h1> <hr>) ؛
Res.Write (يتم التعامل مع هذه الصفحة مباشرة بواسطة DLL) ؛
Res.Write (</html> </body>) ؛
}
}
}
/* ملف المصدر: ex1.cs end*/
في حالة سطر الأوامر ، ترجمة أوامر التجميع التالية ex1.cs إلى ex1.dll وتخزينها في دليل bin.
CSC /T: Library /Oxin/ex1.dll ex1.cs
أضف ASPX-> رسم خرائط DLL إلى Web.Config.
<نسخة XML؟
<simpion>
<stystem.web>
<httphandler>
<ded verb =* path = dlltest1.aspx type = dlltest.ex1page ، ex1 />
</httphandler>
</ssystem.web>
</configuration>
الآن عندما يزور المتصفح http: //localhost/dlltest/dlltest1.aspx ، فهي في الواقع طريقة processRequest لفئة dlltest.ex1 في ex1.dll.
ثالثًا ، قم بتجميع ملف ASPX واحد في DLL
انطلاقًا من "المعنى خارج Microsoft" الموصوفة علنًا في القسم السابق ، لا تدعم Microsoft المطورين لتجميع ملفات ASPX مباشرة في DLL. ومع ذلك ، يجب عرض تقنية ASP.NET Advanced Interface (التحكم في الخادم HTML ، والتحكم في الويب ، وما إلى ذلك) من خلال ملف ASPX. . ل.
تهدأ الآن لتحليل:
برنامج التحويل البرمجي CSC هو مجرد برنامج التحويل البرمجي C#. ملف المصدر.
لذلك ، من أجل تجميع ملف ASPX في ملف DLL ، يجب تحويل ملف ASPX إلى ملف مصدر CS يمكن التعرف عليه بواسطة برنامج التحويل البرمجي CSC. إذن ما هي الأدوات المستخدمة لتحويلها؟ على الرغم من أنني أعتقد أن هذه الأداة يجب أن تكون مخفية في .nt Framework ، فقد راجعت عددًا كبيرًا من المستندات العامة ASP.NET و .NET.
أوه ، لا توجد طريقة للعالم ، وما زالت فرصة عرضية تجعلني أكتشف هذا السر.
ألقِ نظرة على الملف المصدر ex2.aspx:
/* ملف المصدر: ex2.aspx ابدأ*/
<٪@ page language = c# ٪>
<script runat = server>
/*
قرأته بشكل صحيح ، السطر التالي هو "ABCDEFG".
في النص ، أسمي هذا السطر "Trap"
*/
ABCDEFG // TRAM
void page_load (كائن SRC ، eventArgs args)
{{
if (! isPostback) notlabel.text = الرجاء إدخال اسمك: ؛
}
void onnamesubmit (كائن SRC ، eventargs args)
{{
اسم السلسلة = f_name.value ؛
notlabel.text = (الاسم ==)؟ مرحباً! ؛؛
}
</script>
<html>
<body>
<form runat = server>
<h1> dlltest -ex2 (مثال 2) </h1>
<hr>
<ASP: Label Runat = Server ID = Notlabel Style = Color: Red ؛
<input retat = server id = f_name size = 8>
<button retat = server onServerClick = OnNamesUbmit> موافق </button>
</form>
</body>
</html>
/* ملف المصدر: ex2.aspx end*/
إذا كانت تعليقات أو حذف "Trap" ، فإن EX2.ASPX عبارة عن ملف ASP.NET بسيط.
الآن دعنا نفتح "الفخ" ونرى ما الذي عاد ASP.NET؟
أعادت صفحة "خطأ التجميع" ، ولا يمكن تجميع ملفات مصدر التقرير. الأمر المثير للاهتمام هو أن تكون مهتمًا هو الارتباط التشعبي المسمى "إظهار مصدر التجميع الكامل" في أسفل الصفحة. قم بإزالة هذا الجزء من "مصدر التجميع الكامل" وإزالة معلومات رقم السطر السابقة وبعض مفاتيح التجميع الأخرى (بشكل رئيسي أوامر ترجمة #Line) وأغلق "فخ الكود" اللطيف الذي يحذفه أيضًا) ، وبعد الانتهاء ، احفظه كـ ex2_aspx .CS:
/* ملف المصدر: ex2_aspx.cs ابدأ*/
/*
من الوصف أدناه ، يمكن ملاحظة أن هناك بالفعل أداة دون انقطاع لإكمال ملف ASPX المحول إلى ملف مصدر CS
*/
// ----------------------------------------------- ------------------------------------------------- ------------------------------------------------- ------------------- ------------------------------- ---------------------------------------
// <emutogenerate>
// تم إنشاء هذا الرمز بواسطة A أيضًا.
// إصدار وقت التشغيل: 1.0.3705.0
//
// قد يهتم Chinges بهذا الملف سلوكًا غير صحيح وسيضيع إذا
// يتم تجديد الكود.
// </autogenerate>
// ----------------------------------------------- ------------------------------------------------- ------------------------------------------------- ------------------- ------------------------------- ---------------------------------------
/*
الغريب: مساحة التسمية هي في الواقع ASP بدلاً من ASPX
يوصى بتغيير الاسم إلى الاسم المناسب للتطبيقات لمنع تسمية الصراع ، مثل هذه المقالة ، يمكنك التغيير إلى dlltest
لم أتغير هنا للسماح للجميع برؤية مظهره الأصلي
*/
مساحة الاسم ASP {
باستخدام النظام ؛
باستخدام System.Collections ؛
باستخدام System.Collections.speciped ؛
باستخدام System.Configuration ؛
باستخدام system.text ؛
باستخدام system.text.regularexpressions ؛
باستخدام system.web ؛
باستخدام system.web.caching ؛
باستخدام System.Web.SessionState ؛
باستخدام System.Web.Security ؛
باستخدام system.web.ui ؛
باستخدام system.web.ui.webControls ؛
باستخدام system.web.ui.htmlcontrols ؛
/*
1. انتبه إلى تكوين اسم الفصل.
2. انتبه إلى فئة القاعدة. System.Web.UI.PAGE ينفذ واجهة IHTTPHANDLER.
*/
الفئة العامة ex2_aspx: system.web.ui.page ، System.Web.SessionState.irequiressEnerationState {
ثابت int __autohandler ؛
system.web.ui.webcontrols.label notelabel ؛
system.web.ui.htmlcontrols.htmlinputtext f_name ؛
system.web.ui.htmlcontrols.htmlbutton __control3 ؛
system.web.ui.htmlcontrols.htmlform __control2 ؛
BOOL الثابت الخاص __Intialized = false ؛
نظام ثابت خاص.
/* الآن يمكنك إيقاف تشغيل "الفخ"*/
// ABCDEFG
void page_load (كائن SRC ، eventArgs args)
{{
if (! isPostback) notlabel.text = الرجاء إدخال اسمك: ؛
}
void onnamesubmit (كائن SRC ، eventargs args)
{{
اسم السلسلة = f_name.value ؛
notlabel.text = (الاسم ==)؟ مرحباً! ؛؛
}
/* وظيفة البناء*/
public ex2_aspx () {
System.Collections.arrayList التبعيات ؛
if (asp.ex2_aspx .__ intialize == false) {{
التبعيات = new System.Collections.arrayList () ؛
/*
يجب شرح الأسطر التالية بحيث يصبح DLL ملف مستقل مستقل
منع ملفات "الاعتماد" الجديدة والقديمة عند تشغيل DLL
*/
//dependencies.add (w: //wwwroot/dlltest/ex2.aspx) ؛
asp.ex2_aspx .__ filedependencies = التبعيات ؛
asp.ex2_aspx .__ intialized = true ؛
}
}
التجاوز المحمي int autohandler {
يحصل {
إرجاع asp.ex2_aspx .__ autohandler ؛
}
تعيين {
asp.ex2_aspx ._ autoHandlers = value ؛
}
}
System.Web.httpage ApplicationInstance {
يحصل {
return ((system.web.httpapplication) (this.context.applicationInstance)) ؛
}
}
التجاوز العام سلسلة Templatesourcedirectory {
يحصل {
العودة /dlltest ؛
}
}
system.web.ui.control __buildcontrolnotelabel () {
System.Web.ui.WebControls.label __ctrl ؛
__ctrl = new System.Web.ui.WebControls.label () ؛
this.notlabel = __ctrl ؛
__ctrl.id = notelabel ؛
(system.web.ui.iattributeaccors) (__ ctrl).
العودة __Ctrl ؛
}
system.web.ui.control __buildcontrolf_name () {{)
System.Web.ui.htmlcontrols.htmlinputtext __ctrl ؛
__ctrl = new system.web.ui.htmlcontrols.htmlinputtext () ؛
this.f_name = __ctrl ؛
__ctrl.id = f_name ؛
__ctrl.size = 8 ؛
العودة __Ctrl ؛
}
system.web.ui.control __buildcontrol__control3 () {{)
System.Web.ui.htmlControls.htmlbutton __ctrl ؛
__ctrl = new system.web.ui.htmlcontrols.htmlbutton () ؛
هذا .__ control3 = __ctrl ؛
System.Web.ui.iparserAccessor __parser = (system.web.ui.iparseraccessor) (__ctrl)) ؛
__parser.AddParsedSubObject (new System.Web.ui.LiteralControl (OK)) ؛
__ctrl.serverclick += new System.EventHandler (this.onnamesubmit) ؛
العودة __Ctrl ؛
}
system.web.ui.control
System.Web.ui.htmlControls.htmlform __ctrl ؛
__ctrl = new system.web.ui.htmlcontrols.htmlform () ؛
هذا .__ control2 = __ctrl ؛
System.Web.ui.iparserAccessor __parser = (system.web.ui.iparseraccessor) (__ctrl)) ؛
__parser.addparsedSubObject (new system.web.ui.literalcontrol (/r/n <h1> dlltest -ex2 (مثال 2) </h1>/r/n <hr>/r/n))
هذا .__ BuildControlNotelabel () ؛
__parser.AddParsedSubObject (this.notelabel) ؛
__parser.AddParsedSubObject (new System.Web.ui.LiteralControl (/r/n)) ؛
هذا .__ buildControlf_Name () ؛
__parser.AddParsedSubObject (this.f_name) ؛
__parser.AddParsedSubObject (new System.Web.ui.LiteralControl (/r/n)) ؛
هذا .__ BuildControl__Control3 () ؛
__parser.AddParsedSubObject (this .___ control3) ؛
__parser.AddParsedSubObject (new System.Web.ui.LiteralControl (/r/n)) ؛
العودة __Ctrl ؛
}
private void __buildControltree (System.Web.UI.Control __ctrl) {
System.Web.ui.iparserAccessor __parser = (system.web.ui.iparseraccessor) (__ctrl)) ؛
__parser.AddParsedSubObject (new System.Web.ui.LiteralControl (/r/n/r/n <html>/r/n <body>/r/n)) ؛
هذا .__ BuildControl__Control2 () ؛
__parser.AddParsedSubObject (this .___ control2) ؛
__parser.addparsedSubObject (new System.Web.ui.literalcontrol
}
التجاوز المحمي باطل الفراغ الإطارات () {
هذا .__ BuildControltree (هذا) ؛
this.fileDependencies = asp.ex2_aspx .__ filedependencies ؛
this.enableViewStateMac = true ؛
}
التجاوز العام int gettypehashcode () {) {)
العودة -11574299 ؛
}
}
}
/* ملف المصدر: ex2_aspx.cs end*/
أعتقد أنه بعد تحليل هذا الملف ، سيكون لديك فهم إضافي لمبدأ تشغيل ASP.NET (لا علاقة له بهذه المقالة ، غير معقول).
في حالة سطر الأوامر ، فإن أوامر التجميع التالية ترجمة ex2_aspx.cs في ex2.dll وتخزينها في دليل bin.
CSC /T: Library /oxin/ex2.dll ex2_aspx.cs
أضف ASPX-> رسم خرائط DLL إلى Web.Config ، أي إضافة الأسطر التالية في Httphandlers في قسم System.Web:
<derb =* path = dlltest2.aspx type = asp.ex2_aspx ، ex2 />
الآن عندما يزور المتصفح http: //localhost/dlltest/dlltest2.aspx ، فإنه يشبه الوصول إلى ex2.aspx. بالطبع ، حتى لو لم يكن ex2.aspx غير موجود ، أو تم تحديثه ، فلن يكون له أي تأثير على الوصول إلى الصفحة ، ما لم يتم إعادة إنشاء bin/ex2.dll.
رابعًا ، قم بتجميع ملف ASPX الخاص بـ CodeBehind في DLL
لتجميع ملف ASPX الخاص بـ CodeBehind في DLL ، فإن مبدأ تحويل ملف ASPX إلى ملف CS هو نفسه كما هو موضح أعلاه. كملف مصدر CS. الفرق هو الخطوات عند تجميعها في DLL: (لراحة السرد ، على افتراض أن ملف الواجهة هو ex3.aspx ، يتم تخزين ملف codebehind ex3 ex3_aspx.cs))
الخطوة 1: أولاً استخدم الأمر التالي لتجميع ex3.aspx.cs في bin/ex3.aspx.cs.dll
CSC /T: Library /oxin/ex3.aspx.cs.dll ex3.aspx.cs
الخطوة 2: استخدم الأمر التالي لتجميع ex3_aspx.cs في bin/ex3.dll
CSC /T: Library /r:bin/ex3.aspx.cs.dll /out:bin/ex3
ثم أضف aspx-> رسم خرائط DLL إلى ملف configuration web.config ، أي إضافة الأسطر التالية في httphandlers في قسم system.web:
<إضافة verb =* path = dlltest3.aspx type = asp.ex3_aspx ، ex3 />
افتح الآن المستعرض وزيارة http: //localhost/dlltest/dlltest3.aspx.
خمسة ، خدعة صغيرة
عند تعيين "Trap" لتحويل ملف ASPX إلى ملف مصدر CS ، استخدم بشكل عام طريقة النسخ واللصق لحفظ "مصدر التجميع الكامل" في المفكرة أو VS.NET أو غيرها من بيئة تطوير ASP.NET ، ثم حفظها بعد الانتهاء من الحفاظ على ملفات مصدر CS.
التنظيم هو إزالة معلومات رقم السطر من اللصق وتعليم تجميع "#Line". إذا تم حذف هذه المعلومات يدويًا ، فسيكون ذلك مزعجًا للغاية.
واحدة من الحيل التي أستخدمها هي: في دفتر الملاحظات ، استخدم طريقة الاستبدال لتنظيمها بسرعة. استخدم/* سطر لاستبدال جميع الخطوط ، استخدم:*/لاستبدال الكل: ، استخدم // #Line Lines لاستبدال كل #Line ، بعد اكتمال الاستبدال ، قم بتعليق "Trap" ، قم بتعيين إعدادات وظيفة بنية الفئة الرئيسية ، قم بتعيين إعدادات وظيفة المنشئ الرئيسية ، يتم شرح جمل "ملفات التبعية" ، لذلك حتى إذا اكتملت التشطيب.