-
Из-за ограниченной производительности сервера я обнаружил, что после использования Castle + Nhibernate процесс перекомпиляции сервера после обновления веб-сайта становится особенно долгим, иногда занимая более 1 минуты, даже несмотря на то, что опубликованная веб-программа также компилируется. Ниже приведены динамические библиотеки, используемые в Интернете:
Castle.Core.dll
Castle.DynamicProxy2.dll
Castle.Facilitys.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 перезагружается и запускает файлы в моем веб-каталоге. Весь процесс действительно долгий и невыносимый.
[Интересно, есть ли у вас какие-нибудь хорошие предложения, ребята]
Позже я задумался о том, сократит ли размещение вышеуказанных динамических библиотек в 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
gacutil -i log4net.dll
gacutil -i MySql.Data.dll
gacutil -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. Перекомпилируйте веб-сайт и выполните отладку:
Первая проблема: ошибка конфигурации
просмотреть обычную копию в буфер обмена, распечатать?
Ошибка конфигурации
Объяснение: Произошла ошибка при обработке файлов конфигурации, необходимых для обслуживания этого запроса. Пожалуйста, проверьте конкретные сведения об ошибке ниже и измените файл конфигурации соответствующим образом.
Сообщение об ошибке синтаксического анализатора: невозможно загрузить файл или сборку «UrlRewritingNet.UrlRewriter» или одну из его зависимостей. Система не может найти указанный файл. (строка 50 веб-конфигурации)
Ошибка источника:
Строка 48:
Строка 49: <httpModules>
Строка 50: <add name="UrlRewriteModule" type="UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter"/>
Исходный файл: web.config Строки: 50
Описание ошибки конфигурации: Произошла ошибка при обработке файлов конфигурации, необходимых для обслуживания этого запроса. Пожалуйста, проверьте конкретные сведения об ошибке ниже и измените файл конфигурации соответствующим образом.
Сообщение об ошибке синтаксического анализатора: невозможно загрузить файл или сборку «UrlRewritingNet.UrlRewriter» или одну из его зависимостей. Система не может найти указанный файл. (строка 50 веб-конфигурации)
Ошибка источника:
Строка 48:
Строка 49: <httpModules>
Строка 50: <add name="UrlRewriteModule" type="UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter"/>
Исходный файл: web.config Строки: 50
Очевидно, наш веб-проект не нашел библиотеку, уже хранящуюся в GAC. Перед помещением в GAC эти библиотеки компилируются и выводятся в каталог web/bin. Теперь, когда ее невозможно найти автоматически, мы можем изменить web.config, чтобы указать, как осуществляется ссылка на библиотеку:
просмотреть обычную копию в буфер обмена, распечатать?
<конфигурация>
...
<время выполнения>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<qualifyAssembly partsName="log4net" fullName="log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821"/>
<qualifyAssembly partsName="Castle.Windsor" fullName="Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc"/>
<qualifyAssembly partsName="Castle.MicroKernel" fullName="Castle.MicroKernel, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc"/>
... ...
</assemblyBinding>
</время выполнения>
</конфигурация>
<конфигурация>
...
<время выполнения>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<qualifyAssembly partsName="log4net" fullName="log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821"/>
<qualifyAssembly partsName="Castle.Windsor" fullName="Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc"/>
<qualifyAssembly partsName="Castle.MicroKernel" fullName="Castle.MicroKernel, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc"/>
... ...
</assemblyBinding>
</время выполнения>
</конфигурация>
Скомпилируйте, отладьте и запустите снова
Вторая ошибка: ошибка компиляции.
просмотреть обычную копию в буфер обмена, распечатать?
Ошибка сервера в приложении '/'.
-------------------------------------------------- ----------------------------------
Ошибка компиляции
Объяснение: Произошла ошибка при компиляции ресурсов, необходимых для обслуживания этого запроса. Пожалуйста, проверьте следующие сведения об ошибке и соответствующим образом измените исходный код.
Сообщение об ошибке компилятора: CS0012: Тип «Castle.Windsor.IContainerAccessor» определен в сборке, на которую нет ссылки. Необходимо добавить ссылку на сборку Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc.
Ошибка источника:
[Нет соответствующих исходных строк]
Исходный файл: c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET FilesrootxxxxxxyyyyyyyyApp_Web_default.aspx.zzzzzz.aaaaaaaa.0.cs Строка: 133
Ошибка сервера в приложении '/'.
-------------------------------------------------- ----------------------------------
Описание ошибки компиляции: Произошла ошибка во время компиляции ресурсов, необходимых для обслуживания этого запроса. Пожалуйста, проверьте следующие сведения об ошибке и соответствующим образом измените исходный код.
Сообщение об ошибке компилятора: CS0012: Тип «Castle.Windsor.IContainerAccessor» определен в сборке, на которую нет ссылки. Необходимо добавить ссылку на сборку Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc.
Ошибка источника:
[Нет соответствующих исходных строк]
Исходный файл: c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET FilesrootxxxxxxyyyyyyyyApp_Web_default.aspx.zzzzzz.aaaaaaaa.0.cs Строка: 133
На этот раз это ошибка компиляции, но сообщение об ошибке неясно, и в настоящее время невозможно найти конкретное содержимое. Измените web.config и добавьте раздел конфигурации (компиляцию), как показано ниже.
просмотреть обычную копию в буфер обмена, распечатать?
<конфигурация>
<система.веб>
... ...
<компиляция debug="true" />
... ...
</система.веб>
</конфигурация>
<конфигурация>
<система.веб>
... ...
<компиляция debug="true" />
... ...
</система.веб>
</конфигурация>
Снова отладка:
просмотреть обычную копию в буфер обмена, распечатать?
Ошибка компиляции
Объяснение: Произошла ошибка при компиляции ресурсов, необходимых для обслуживания этого запроса. Пожалуйста, проверьте следующие сведения об ошибке и соответствующим образом измените исходный код.
Сообщение об ошибке компилятора: CS0012: Тип «Castle.Windsor.IContainerAccessor» определен в сборке, на которую нет ссылки. Необходимо добавить ссылку на сборку Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc.
Ошибка источника:
Строка 134: }
Строка 135:
Строка 136: protected ASP.global_asax ApplicationInstance {
Строка 137: получить {
Строка 138: return ((ASP.global_asax)(this.Context.ApplicationInstance));
Исходный файл: c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET FilesrootxxxxxxyyyyyyyyApp_Web_default.aspx.zzzzzz.aaaaaaaa.0.cs Строка: 136
Описание ошибки компиляции: Произошла ошибка во время компиляции ресурсов, необходимых для обслуживания этого запроса. Пожалуйста, проверьте следующие сведения об ошибке и соответствующим образом измените исходный код.
Сообщение об ошибке компилятора: CS0012: Тип «Castle.Windsor.IContainerAccessor» определен в сборке, на которую нет ссылки. Необходимо добавить ссылку на сборку Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc.
Ошибка источника:
Строка 134: }
Строка 135:
Строка 136: protected ASP.global_asax ApplicationInstance {
Строка 137: получить {
Строка 138: return ((ASP.global_asax)(this.Context.ApplicationInstance));
Исходный файл: c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET FilesrootxxxxxxyyyyyyyyApp_Web_default.aspx.zzzzzz.aaaaaaaa.0.cs Строка: 136
Это сообщение об ошибке является наиболее важным:
Сообщение об ошибке компилятора: CS0012: Тип «Castle.Windsor.IContainerAccessor» определен в сборке, на которую нет ссылки. Необходимо добавить ссылку на сборку Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc.
Очевидно, что после того, как мы изменили web.config, служба iis перезапустила текущий веб-проект и скомпилировала его. Первым делом нужно было скомпилировать global.asax.cs. Одна из инициализированных переменных также может быть статической переменной Castle. Вызывается Windsor, а csc не может найти этот Castle.Windsor, а это действительно хлопотный процесс.
Первая попытка: в справочном разделе веб-проекта установите Castle.Windsor. Первоначально, когда к динамической библиотеке обращались напрямую, она выводилась в web/bin синхронно. После ссылки на GAC этот вывод был отменен. Теперь сбросьте его. Установите значение «Копировать на локальный». Разумеется, компиляция после установки выведет этот файл: Castle.Windsor в web/bin. Таким образом отладку тоже можно пройти, потому что он нашел эту динамическую библиотеку.
Но это не снимает наших сомнений, то есть сборка, определенная в <runtime><assemblyBinding>... ...</assemblyBinding><runtime>, не влияет на процесс компиляции, поэтому ее необходимо использовать в процессе компиляции Какой это раздел?
Вторая попытка. Подумайте о разделе (компиляция) в первой попытке, проверьте описание msdn и убедитесь, что в <компиляция> есть определение <assemblies>. Добавьте следующую конфигурацию:
просмотреть обычную копию в буфер обмена, распечатать?
<компиляция debug="false">
<сборки>
<add Assembly="Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc"/>
</сборки>
</компиляция>
<компиляция debug="false">
<сборки>
<add Assembly="Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc"/>
</сборки>
</компиляция>
Затем отмените «Копировать на локальный компьютер» для Castle.Windsor в веб-проекте, перекомпилируйте и запустите.
Все работают нормально.
На данный момент мы успешно поместили все динамические библиотеки, на которые ссылаются третьи стороны, в GAC.