-
Debido al rendimiento limitado del servidor, descubrí que desde que utilicé Castle + Nhibernate, el proceso de recompilación del servidor después de actualizar el sitio web es particularmente largo, a veces toma más de 1 minuto, a pesar de que el programa web publicado también se compila. Las siguientes son las bibliotecas dinámicas utilizadas por la web:
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
Cada vez que se actualiza mi proyecto web y el web.dll generado después de la recompilación se carga en el servidor, el servidor w3p se reiniciará y copiará los archivos en mi directorio web. Todo el proceso es realmente largo e insoportable.
[Me pregunto si ustedes tienen alguna buena sugerencia]
Más tarde, pensé si colocar las bibliotecas dinámicas anteriores en el GAC reduciría el tiempo requerido para reiniciar (la práctica ha demostrado que no hay cambios obvios).
Este artículo no resolvió el problema original, pero debido a que implica un problema de hacer referencia a una biblioteca dinámica de terceros almacenada en GAC en asp.net, aún lo grabé (:-) Este es el enfoque de este artículo).
Todas las bibliotecas dinámicas anteriores están firmadas y el proceso para colocarlas en GAC es:
1. Registre la biblioteca dinámica de terceros en 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
Este proceso es relativamente fácil, gacutil se puede encontrar en el SDK de .net framework (paquete de redistribución)
2. Redefinir cómo los proyectos web hacen referencia a bibliotecas dinámicas de terceros: hacen referencia directamente a GAC
Otro problema encontrado aquí es que vs2005 no puede hacer referencia a la biblioteca dinámica de terceros definida en GAC a menos que se realicen las siguientes configuraciones:
Supongamos que la biblioteca dinámica de terceros que definió está almacenada en: c:3rdlibs
Modifique el registro: HKEY_LOCAL_MACHINESOFTWAREMicrosoft.NETFrameworkAssemblyFolders
Agregue un elemento en este proyecto y apúntelo a c:3rhlibs
Ahora podemos hacer referencia a bibliotecas GAC de terceros en nuestros proyectos web.
3. Vuelva a compilar la web y depurar:
El primer problema: error de configuración.
¿Ver copia simple en el portapapeles?
Error de configuración
Explicación: Se produjo un error al procesar los archivos de configuración necesarios para atender esta solicitud. Verifique los detalles del error específico a continuación y modifique el archivo de configuración adecuadamente.
Mensaje de error del analizador: no se puede cargar el archivo o ensamblado 'UrlRewritingNet.UrlRewriter' o una de sus dependencias. El sistema no puede encontrar el archivo especificado. (web.config línea 50)
Error de fuente:
Línea 48:
Línea 49: <httpModules>
Línea 50: <add name="UrlRewriteModule" type="UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter"/>
Archivo fuente: web.config Líneas: 50
Descripción del error de configuración: se produjo un error al procesar los archivos de configuración necesarios para atender esta solicitud. Verifique los detalles del error específico a continuación y modifique el archivo de configuración adecuadamente.
Mensaje de error del analizador: no se puede cargar el archivo o ensamblado 'UrlRewritingNet.UrlRewriter' o una de sus dependencias. El sistema no puede encontrar el archivo especificado. (web.config línea 50)
Error de fuente:
Línea 48:
Línea 49: <httpModules>
Línea 50: <add name="UrlRewriteModule" type="UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter"/>
Archivo fuente: web.config Líneas: 50
Obviamente nuestro proyecto web no encontró la biblioteca ya almacenada en el GAC. Antes de colocarse en GAC, estas bibliotecas se compilan y se envían al directorio web/bin. Ahora que no se puede ubicar automáticamente, podemos modificar web.config para especificar cómo se hace referencia a la biblioteca:
¿Ver copia simple en el portapapeles?
<configuración>
...
<tiempo de ejecución>
<assemblyBinding xmlns="urna:schemas-microsoft-com:asm.v1">
<qualifyAssembly partName="log4net" fullName="log4net, Versión=1.2.10.0, Cultura=neutral, PublicKeyToken=1b44e1d426115821"/>
<qualifyAssembly partName="Castle.Windsor" fullName="Castle.Windsor, Versión=1.0.3.0, Cultura=neutral, PublicKeyToken=407dd0808d44fbdc"/>
<qualifyAssembly partName="Castle.MicroKernel" fullName="Castle.MicroKernel, Versión=1.0.3.0, Cultura=neutral, PublicKeyToken=407dd0808d44fbdc"/>
... ...
</ensamblajeBinding>
</tiempo de ejecución>
</configuración>
<configuración>
...
<tiempo de ejecución>
<assemblyBinding xmlns="urna:schemas-microsoft-com:asm.v1">
<qualifyAssembly partName="log4net" fullName="log4net, Versión=1.2.10.0, Cultura=neutral, PublicKeyToken=1b44e1d426115821"/>
<qualifyAssembly partName="Castle.Windsor" fullName="Castle.Windsor, Versión=1.0.3.0, Cultura=neutral, PublicKeyToken=407dd0808d44fbdc"/>
<qualifyAssembly partName="Castle.MicroKernel" fullName="Castle.MicroKernel, Versión=1.0.3.0, Cultura=neutral, PublicKeyToken=407dd0808d44fbdc"/>
... ...
</ensamblajeBinding>
</tiempo de ejecución>
</configuración>
Compile, depure y ejecute nuevamente
Segundo error: error de compilación
¿Ver copia simple en el portapapeles?
Error del servidor en la aplicación '/'.
-------------------------------------------------- ----------------------------------
Error de compilación
Explicación: Se produjo un error al compilar los recursos necesarios para atender esta solicitud. Verifique los siguientes detalles de error específicos y modifique el código fuente adecuadamente.
Mensaje de error del compilador: CS0012: el tipo 'Castle.Windsor.IContainerAccessor' está definido en un ensamblado al que no se hace referencia. Se debe agregar una referencia al ensamblado "Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc".
Error de fuente:
[No hay líneas fuente relevantes]
Archivo fuente: c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET FilesrootxxxxxxyyyyyyyyApp_Web_default.aspx.zzzzzzz.aaaaaaaa.0.cs Línea: 133
Error del servidor en la aplicación '/'.
-------------------------------------------------- ----------------------------------
Descripción del error de compilación: se produjo un error durante la compilación de los recursos necesarios para atender esta solicitud. Verifique los siguientes detalles de error específicos y modifique el código fuente adecuadamente.
Mensaje de error del compilador: CS0012: el tipo 'Castle.Windsor.IContainerAccessor' está definido en un ensamblado al que no se hace referencia. Se debe agregar una referencia al ensamblado "Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc".
Error de fuente:
[No hay líneas fuente relevantes]
Archivo fuente: c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET FilesrootxxxxxxyyyyyyyyApp_Web_default.aspx.zzzzzzz.aaaaaaaa.0.cs Línea: 133
Esta vez es un error de compilación, pero el mensaje de error no es claro y no se puede localizar el contenido específico por el momento. Modifique web.config y agregue una sección de configuración (compilación), de la siguiente manera.
¿Ver copia simple en el portapapeles?
<configuración>
<sistema.web>
... ...
<compilación depuración="verdadero" />
... ...
</sistema.web>
</configuración>
<configuración>
<sistema.web>
... ...
<compilación depuración="verdadero" />
... ...
</sistema.web>
</configuración>
Depurando nuevamente:
¿Ver copia simple en el portapapeles?
Error de compilación
Explicación: Se produjo un error al compilar los recursos necesarios para atender esta solicitud. Verifique los siguientes detalles de error específicos y modifique el código fuente adecuadamente.
Mensaje de error del compilador: CS0012: el tipo 'Castle.Windsor.IContainerAccessor' está definido en un ensamblado al que no se hace referencia. Se debe agregar una referencia al ensamblado "Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc".
Error de fuente:
Línea 134: }
Línea 135:
Línea 136: Instancia de aplicación ASP.global_asax protegida {
Línea 137: obtenga {
Línea 138: retorno ((ASP.global_asax)(this.Context.ApplicationInstance));
Archivo fuente: c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET FilesrootxxxxxxyyyyyyyyApp_Web_default.aspx.zzzzzzz.aaaaaaaa.0.cs Línea: 136
Descripción del error de compilación: se produjo un error durante la compilación de los recursos necesarios para atender esta solicitud. Verifique los siguientes detalles de error específicos y modifique el código fuente adecuadamente.
Mensaje de error del compilador: CS0012: el tipo 'Castle.Windsor.IContainerAccessor' está definido en un ensamblado al que no se hace referencia. Se debe agregar una referencia al ensamblado "Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc".
Error de fuente:
Línea 134: }
Línea 135:
Línea 136: Instancia de aplicación ASP.global_asax protegida {
Línea 137: obtenga {
Línea 138: retorno ((ASP.global_asax)(this.Context.ApplicationInstance));
Archivo fuente: c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET FilesrootxxxxxxyyyyyyyyApp_Web_default.aspx.zzzzzzz.aaaaaaaa.0.cs Línea: 136
Este mensaje de error es el más importante:
Mensaje de error del compilador: CS0012: el tipo 'Castle.Windsor.IContainerAccessor' está definido en un ensamblado al que no se hace referencia. Se debe agregar una referencia al ensamblado "Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc".
Obviamente, después de modificar web.config, el servicio iis reinició el proyecto web actual y lo compiló. Lo primero que se compiló fue global.asax.cs. Una de las variables inicializadas también puede ser estática. Se llama a Windsor y csc no puede encontrar este castillo. Windsor, lo cual es realmente un proceso problemático.
Primer intento: en la sección de referencia del proyecto web, configure Castle.Windsor. Originalmente, cuando se hacía referencia directamente a la biblioteca dinámica, se enviaba a web/bin sincrónicamente. Después de hacer referencia al GAC, esta salida se canceló. Establezca en "Copiar a local". Por supuesto, la compilación después de la configuración generará este archivo: Castle.Windsor a web/bin. De esta manera, la depuración también puede realizarse porque encontró esta biblioteca dinámica.
Pero esto no nos quita las dudas, es decir, el ensamblado definido en <runtime><assemblyBinding>... ...</assemblyBinding><runtime> no afecta el proceso de compilación, por lo que debe usarse durante el proceso de compilación. ¿Qué sección es?
Segundo intento: piense en la sección (compilación) en el primer intento, verifique la descripción de msdn y sepa que hay una definición de <ensamblajes> en <compilación>. Agregue la configuración de la siguiente manera:
¿Ver copia simple en el portapapeles?
<depuración de compilación="falso">
<ensamblajes>
<agregar ensamblaje="Castle.Windsor, Versión=1.0.3.0, Cultura=neutral, PublicKeyToken=407dd0808d44fbdc"/>
</conjuntos>
</compilación>
<depuración de compilación="falso">
<ensamblajes>
<agregar ensamblaje="Castle.Windsor, Versión=1.0.3.0, Cultura=neutral, PublicKeyToken=407dd0808d44fbdc"/>
</conjuntos>
</compilación>
Luego cancele "Copiar a local" para Castle.Windsor en el proyecto web, vuelva a compilar y ejecutar.
Todos están funcionando bien.
En este punto, hemos colocado con éxito todas las bibliotecas dinámicas a las que hacen referencia terceros en el GAC.