-
نظرًا للأداء المحدود للخادم، وجدت أنه منذ استخدام Castle + Nhibernate، أصبحت عملية إعادة ترجمة الخادم بعد تحديث موقع الويب طويلة جدًا، وتستغرق أحيانًا أكثر من دقيقة واحدة، على الرغم من تجميع برنامج الويب المنشور أيضًا. فيما يلي المكتبات الديناميكية التي يستخدمها الويب:
Castle.Core.dll
Castle.DynamicProxy2.dll
Castle.Facilities.AutomaticTransactionManagement.dll
Castle.Facilities.NHibernateIntegration.dll
Castle.MicroKernel.dll
Castle.Services.Transaction.dll
Castle.Windsor.dll
FredCK.FCKeditorV2.dll
Iesi.Collections.dll
log4net.dll
MySql.Data.dll/System.Data.SQLite.dll
NHibernate.dll
UrlRewritingNet.UrlRewriter.dll
في كل مرة يتم فيها تحديث مشروع الويب الخاص بي ويتم تحميل ملف web.dll الذي تم إنشاؤه بعد إعادة الترجمة إلى الخادم، سيتم إعادة تشغيل الخادم w3p وcsc الملفات الموجودة في دليل الويب الخاص بي، وتكون العملية برمتها طويلة جدًا ولا تطاق.
[أتساءل عما إذا كان لديك أي اقتراحات جيدة يا رفاق]
لاحقًا، فكرت فيما إذا كان وضع المكتبات الديناميكية المذكورة أعلاه في GAC سيؤدي إلى تقليل الوقت المطلوب لإعادة التشغيل (أثبتت الممارسة أنه لا يوجد تغيير واضح).
لم تحل هذه المقالة المشكلة الأصلية، ولكن لأنها تتضمن مشكلة في الرجوع إلى مكتبة ديناميكية تابعة لجهة خارجية مخزنة في GAC في asp.net، ما زلت أسجلها (:-) هذا هو محور هذه المقالة).
تم توقيع كافة المكتبات الديناميكية المذكورة أعلاه، وتتم عملية وضعها في GAC كما يلي:
1. قم بتسجيل مكتبة ديناميكية تابعة لجهة خارجية في GAC
gacutil -i Castle.Core.dll
gacutil -i Castle.DynamicProxy2.dll
gacutil -i Castle.Facilities.AutomaticTransactionManagement.dll
gacutil -i Castle.Facilities.NHibernateIntegration.dll
gacutil -i Castle.MicroKernel.dll
gacutil -i Castle.Services.Transaction.dll
gacutil -i Castle.Windsor.dll
gacutil -i FredCK.FCKeditorV2.dll
gacutil -i Iesi.Collections.dll
gacutil -i Intelligencia.UrlRewriter.dll
جاكوتيل -i log4net.dll
gacutil -i MySql.Data.dll
جاكوتيل -i NHibernate.dll
gacutil -i System.Data.SQLite.dll
gacutil -i UrlRewritingNet.UrlRewriter.dll
هذه العملية سهلة نسبيًا، ويمكن العثور على gacutil ضمن sdk الخاص بـ .net Framework (حزمة إعادة التوزيع)
2. أعد تعريف كيفية إحالة مشاريع الويب إلى المكتبات الديناميكية التابعة لجهات خارجية: قم بالإشارة مباشرة إلى GAC
هناك مشكلة أخرى تمت مواجهتها هنا وهي أن vs2005 لا يمكنه الرجوع إلى المكتبة الديناميكية لجهة خارجية المحددة في GAC ما لم يتم إجراء الإعدادات التالية:
افترض أن المكتبة الديناميكية التابعة لجهة خارجية التي حددتها مخزنة في: c:3rdlibs
تعديل التسجيل: HKEY_LOCAL_MACHINESOFTWAREMicrosoft.NETFrameworkAssemblyFolders
قم بإضافة عنصر ضمن هذا المشروع وقم بتوجيهه إلى c:3rhlibs
يمكننا الآن الرجوع إلى مكتبات GAC التابعة لجهات خارجية في مشاريع الويب الخاصة بنا.
3. إعادة ترجمة الويب وتصحيح الأخطاء:
المشكلة الأولى: خطأ في التكوين
عرض نسخة عادية إلى الحافظة؟
خطأ في التكوين
Explanation: حدث خطأ أثناء معالجة ملفات التكوين المطلوبة لخدمة هذا الطلب. يرجى التحقق من تفاصيل الخطأ المحددة أدناه وتعديل ملف التكوين بشكل مناسب.
رسالة خطأ المحلل اللغوي: غير قادر على تحميل الملف أو التجميع "UrlRewritingNet.UrlRewriter" أو أحد تبعياته. لا يمكن للنظام العثور على الملف المحدد. (خط web.config 50)
خطأ المصدر:
السطر 48:
السطر 49: <httpModules>
السطر 50: <add name="UrlRewriteModule" type="UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter"/>
الملف المصدر: web.config الأسطر: 50
وصف خطأ التكوين: حدث خطأ أثناء معالجة ملفات التكوين المطلوبة لخدمة هذا الطلب. يرجى التحقق من تفاصيل الخطأ المحددة أدناه وتعديل ملف التكوين بشكل مناسب.
رسالة خطأ المحلل اللغوي: غير قادر على تحميل الملف أو التجميع "UrlRewritingNet.UrlRewriter" أو أحد تبعياته. لا يمكن للنظام العثور على الملف المحدد. (خط web.config 50)
خطأ المصدر:
السطر 48:
السطر 49: <httpModules>
السطر 50: <add name="UrlRewriteModule" type="UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter"/>
الملف المصدر: web.config الأسطر: 50
من الواضح أن مشروع الويب الخاص بنا لم يعثر على المكتبة المخزنة بالفعل في GAC. قبل وضعها في GAC، يتم تجميع هذه المكتبات وإخراجها إلى دليل الويب/bin. الآن بعد أن تعذر تحديد موقعها تلقائيًا، يمكننا تعديل web.config لتحديد كيفية الرجوع إلى المكتبة:
عرض نسخة عادية إلى الحافظة؟
<التكوين>
...
<وقت التشغيل>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<qualifyAssembly PartialName = "log4net" fullName = "log4net، الإصدار = 1.2.10.0، الثقافة = محايدة، PublicKeyToken = 1b44e1d426115821"/>
<qualifyAssembly PartialName="Castle.Windsor" fullName="Castle.Windsor، الإصدار=1.0.3.0، الثقافة=محايدة، PublicKeyToken=407dd0808d44fbdc"/>
<qualifyAssembly PartialName="Castle.MicroKernel" fullName="Castle.MicroKernel، الإصدار=1.0.3.0، الثقافة=محايدة، PublicKeyToken=407dd0808d44fbdc"/>
... ...
</assemblyBinding>
</وقت التشغيل>
</التكوين>
<التكوين>
...
<وقت التشغيل>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<qualifyAssembly PartialName = "log4net" fullName = "log4net، الإصدار = 1.2.10.0، الثقافة = محايدة، PublicKeyToken = 1b44e1d426115821"/>
<qualifyAssembly PartialName="Castle.Windsor" fullName="Castle.Windsor، الإصدار=1.0.3.0، الثقافة=محايدة، PublicKeyToken=407dd0808d44fbdc"/>
<qualifyAssembly PartialName="Castle.MicroKernel" fullName="Castle.MicroKernel، الإصدار=1.0.3.0، الثقافة=محايدة، PublicKeyToken=407dd0808d44fbdc"/>
... ...
</assemblyBinding>
</وقت التشغيل>
</التكوين>
ترجمة وتصحيح وتشغيل مرة أخرى
الخطأ الثاني: خطأ في التجميع
عرض نسخة عادية إلى الحافظة؟
خطأ في الخادم في تطبيق '/'.
-------------------------------------------------- ----------------------------------
خطأ في التجميع
Explanation: حدث خطأ أثناء تجميع الموارد المطلوبة لخدمة هذا الطلب. يرجى التحقق من تفاصيل الخطأ المحددة التالية وتعديل كود المصدر بشكل مناسب.
رسالة خطأ المحول البرمجي: CS0012: تم تعريف النوع 'Castle.Windsor.IContainerAccessor' في تجميع لم تتم الإشارة إليه. يجب إضافة مرجع للتجميع "Castle.Windsor, Version=1.0.3.0, Culture=محايد, PublicKeyToken=407dd0808d44fbdc".
خطأ المصدر:
[لا توجد خطوط مصدر ذات صلة]
الملف المصدر: c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET FilesrootxxxxxxyyyyyyyyApp_Web_default.aspx.zzzzzzzz.aaaaaaaa.0.cs السطر: 133
خطأ في الخادم في تطبيق '/'.
-------------------------------------------------- ----------------------------------
وصف خطأ التجميع: حدث خطأ أثناء تجميع الموارد المطلوبة لخدمة هذا الطلب. يرجى التحقق من تفاصيل الخطأ المحددة التالية وتعديل كود المصدر بشكل مناسب.
رسالة خطأ المحول البرمجي: CS0012: تم تعريف النوع 'Castle.Windsor.IContainerAccessor' في تجميع لم تتم الإشارة إليه. يجب إضافة مرجع للتجميع "Castle.Windsor, Version=1.0.3.0, Culture=محايد, PublicKeyToken=407dd0808d44fbdc".
خطأ المصدر:
[لا توجد خطوط مصدر ذات صلة]
الملف المصدر: c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET FilesrootxxxxxxyyyyyyyyApp_Web_default.aspx.zzzzzzzz.aaaaaaaa.0.cs السطر: 133
هذه المرة خطأ في التجميع، لكن رسالة الخطأ غير واضحة ولا يمكن تحديد موقع المحتوى المحدد في الوقت الحالي. قم بتعديل web.config وأضف قسم التكوين (التجميع)، كما يلي
عرض نسخة عادية إلى الحافظة؟
<التكوين>
<system.web>
... ...
<تصحيح الأخطاء = "صحيح" />
... ...
</system.web>
</التكوين>
<التكوين>
<system.web>
... ...
<تصحيح الأخطاء = "صحيح" />
... ...
</system.web>
</التكوين>
تصحيح الأخطاء مرة أخرى:
عرض نسخة عادية إلى الحافظة؟
خطأ في التجميع
Explanation: حدث خطأ أثناء تجميع الموارد المطلوبة لخدمة هذا الطلب. يرجى التحقق من تفاصيل الخطأ المحددة التالية وتعديل كود المصدر بشكل مناسب.
رسالة خطأ المحول البرمجي: CS0012: تم تعريف النوع 'Castle.Windsor.IContainerAccessor' في تجميع لم تتم الإشارة إليه. يجب إضافة مرجع للتجميع "Castle.Windsor, Version=1.0.3.0, Culture=محايد, PublicKeyToken=407dd0808d44fbdc".
خطأ المصدر:
السطر 134: }
السطر 135:
السطر 136: ASP.global_asax ApplicationInstance محمي {
السطر 137: احصل على {
السطر 138: إرجاع ((ASP.global_asax)(this.Context.ApplicationInstance));
الملف المصدر: c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET FilesrootxxxxxxyyyyyyyyApp_Web_default.aspx.zzzzzzzz.aaaaaaaa.0.cs السطر: 136
وصف خطأ التجميع: حدث خطأ أثناء تجميع الموارد المطلوبة لخدمة هذا الطلب. يرجى التحقق من تفاصيل الخطأ المحددة التالية وتعديل كود المصدر بشكل مناسب.
رسالة خطأ المحول البرمجي: CS0012: تم تعريف النوع 'Castle.Windsor.IContainerAccessor' في تجميع لم تتم الإشارة إليه. يجب إضافة مرجع للتجميع "Castle.Windsor, Version=1.0.3.0, Culture=محايد, PublicKeyToken=407dd0808d44fbdc".
خطأ المصدر:
السطر 134: }
السطر 135:
السطر 136: ASP.global_asax ApplicationInstance محمي {
السطر 137: احصل على {
السطر 138: إرجاع ((ASP.global_asax)(this.Context.ApplicationInstance));
الملف المصدر: c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET FilesrootxxxxxxyyyyyyyyApp_Web_default.aspx.zzzzzzzz.aaaaaaaa.0.cs السطر: 136
رسالة الخطأ هذه هي الأهم:
رسالة خطأ المحول البرمجي: CS0012: تم تعريف النوع 'Castle.Windsor.IContainerAccessor' في تجميع لم تتم الإشارة إليه. يجب إضافة مرجع للتجميع "Castle.Windsor, Version=1.0.3.0, Culture=محايد, PublicKeyToken=407dd0808d44fbdc".
من الواضح أنه بعد أن قمنا بتعديل web.config، قامت خدمة iis بإعادة تشغيل مشروع الويب الحالي وتجميعه. أول شيء سيتم تجميعه هو global.asax.cs وقد يكون أحد المتغيرات التي تمت تهيئتها متغيرًا ثابتًا أيضًا. تم استدعاء Windsor، ولم يتمكن CSC من العثور على هذه Castle.Windsor، وهي عملية مزعجة حقًا.
المحاولة الأولى: في القسم المرجعي لمشروع الويب، قم بتعيين Castle.Windsor. في الأصل، عندما تمت الإشارة إلى المكتبة الديناميكية بشكل مباشر، تم إخراجها إلى الويب/bin بشكل متزامن بعد الإشارة إلى GAC، تم إلغاء هذا الإخراج الآن اضبط على "نسخ إلى محلي". بالطبع، سيؤدي التجميع بعد الإعداد إلى إخراج هذا الملف: Castle.Windsor إلى web/bin، وبهذه الطريقة، يمكن أن يمر التصحيح أيضًا لأنه وجد هذه المكتبة الديناميكية.
لكن هذا لا يخفف من شكوكنا، أي أن التجميع المحدد في <runtime><assemblyBinding>... ...</assemblyBinding><runtime> لا يؤثر على عملية التجميع، لذا يجب استخدامه أثناء عملية التجميع أي قسم هو؟
المحاولة الثانية: فكر في قسم (التجميع) في المحاولة الأولى، وتحقق من وصف msdn، واعلم أن هناك تعريفًا لـ <assemblies> في <compilation> وأضف التكوين كما يلي:
عرض نسخة عادية إلى الحافظة؟
<تصحيح الأخطاء = "خطأ">
<التجمعات>
<add Assembly="Castle.Windsor, Version=1.0.3.0, Culture=محايد, PublicKeyToken=407dd0808d44fbdc"/>
</التجمعات>
</تجميع>
<تصحيح الأخطاء = "خطأ">
<التجمعات>
<add Assembly="Castle.Windsor, Version=1.0.3.0, Culture=محايد, PublicKeyToken=407dd0808d44fbdc"/>
</التجمعات>
</تجميع>
ثم قم بإلغاء "نسخ إلى محلي" لـ Castle.Windsor في مشروع الويب، وأعد الترجمة والتشغيل.
كلها تعمل بشكل جيد.
في هذه المرحلة، نجحنا في وضع كافة المكتبات الديناميكية التي تمت الإشارة إليها بواسطة جهات خارجية في GAC.