-
Devido ao desempenho limitado do servidor, descobri que desde a utilização do Castle + Nhibernate, o processo de recompilação do servidor após a atualização do site é particularmente longo, às vezes demorando mais de 1 minuto, embora o programa web publicado também seja compilado. A seguir estão as bibliotecas dinâmicas usadas pela 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 meu projeto web é atualizado e o web.dll gerado após a recompilação é carregado no servidor, o servidor w3p será reiniciado e csc os arquivos em meu diretório web. Todo o processo é realmente longo e insuportável.
[Eu me pergunto se vocês têm alguma boa sugestão]
Mais tarde, pensei se colocar as bibliotecas dinâmicas acima no GAC reduziria o tempo necessário para reiniciar (a prática provou que não há nenhuma mudança óbvia).
Este artigo não resolveu o problema original, mas por envolver um problema de referência a uma biblioteca dinâmica de terceiros armazenada no GAC em asp.net, ainda registrei (:-) Este é o foco deste artigo).
Todas as bibliotecas dinâmicas acima são assinadas e o processo de colocá-las no GAC é:
1. Registre biblioteca dinâmica de terceiros no 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 Inteligencia.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 processo é relativamente fácil, o gacutil pode ser encontrado no SDK do framework .net (pacote de redistribuição)
2. Redefinir como os projetos da Web fazem referência a bibliotecas dinâmicas de terceiros: faça referência direta ao GAC
Outro problema encontrado aqui é que o vs2005 não pode fazer referência à biblioteca dinâmica de terceiros definida no GAC, a menos que as seguintes configurações sejam feitas:
Suponha que a biblioteca dinâmica de terceiros que você definiu esteja armazenada em: c:3rdlibs
Modifique o registro: HKEY_LOCAL_MACHINESOFTWAREMicrosoft.NETFrameworkAssemblyFolders
Adicione um item neste projeto e aponte-o para c:3rhlibs
Agora podemos fazer referência a bibliotecas GAC de terceiros em nossos projetos web.
3. Recompile a web e depure:
O primeiro problema: erro de configuração
visualizar cópia simples para impressão da área de transferência?
Erro de configuração
Explicação: Ocorreu um erro ao processar os arquivos de configuração necessários para atender este pedido. Verifique os detalhes específicos do erro abaixo e modifique o arquivo de configuração adequadamente.
Mensagem de erro do analisador: não é possível carregar o arquivo ou assembly 'UrlRewritingNet.UrlRewriter' ou uma de suas dependências. O sistema não consegue encontrar o arquivo especificado. (web.config linha 50)
Erro de origem:
Linha 48:
Linha 49:
Linha 50:
Arquivo fonte: web.config Linhas: 50
Descrição do erro de configuração: ocorreu um erro ao processar os arquivos de configuração necessários para atender esta solicitação. Verifique os detalhes específicos do erro abaixo e modifique o arquivo de configuração adequadamente.
Mensagem de erro do analisador: não é possível carregar o arquivo ou assembly 'UrlRewritingNet.UrlRewriter' ou uma de suas dependências. O sistema não consegue encontrar o arquivo especificado. (web.config linha 50)
Erro de origem:
Linha 48:
Linha 49:
Linha 50:
Arquivo fonte: web.config Linhas: 50
Obviamente nosso projeto web não encontrou a biblioteca já armazenada no GAC. Antes de serem colocadas no GAC, essas bibliotecas são compiladas e enviadas para o diretório web/bin. Agora que não pode ser localizado automaticamente, podemos modificar web.config para especificar como a biblioteca é referenciada:
visualizar cópia simples para impressão da área de transferência?
...
... ...
...
... ...
Compile, depure e execute novamente
Segundo erro: erro de compilação
visualizar cópia simples para impressão da área de transferência?
Erro de servidor no aplicativo '/'.
-------------------------------------------------- ----------------------------------
Erro de compilação
Explicação: Ocorreu um erro ao compilar os recursos necessários para atender este pedido. Verifique os seguintes detalhes de erro específicos e modifique o código-fonte adequadamente.
Mensagem de erro do compilador: CS0012: O tipo 'Castle.Windsor.IContainerAccessor' está definido em um assembly que não é referenciado. Uma referência ao assembly "Castle.Windsor, Versão=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc" deve ser adicionada.
Erro de origem:
[Sem linhas de origem relevantes]
Arquivo de origem: c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET FilesrootxxxxxxyyyyyyyyApp_Web_default.aspx.zzzzzzz.aaaaaaaa.0.cs Linha: 133
Erro de servidor no aplicativo '/'.
-------------------------------------------------- ----------------------------------
Descrição do erro de compilação: ocorreu um erro durante a compilação dos recursos necessários para atender esta solicitação. Verifique os seguintes detalhes de erro específicos e modifique o código-fonte adequadamente.
Mensagem de erro do compilador: CS0012: O tipo 'Castle.Windsor.IContainerAccessor' está definido em um assembly que não é referenciado. Uma referência ao assembly "Castle.Windsor, Versão=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc" deve ser adicionada.
Erro de origem:
[Sem linhas de origem relevantes]
Arquivo de origem: c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET FilesrootxxxxxxyyyyyyyyApp_Web_default.aspx.zzzzzzz.aaaaaaaa.0.cs Linha: 133
Desta vez é um erro de compilação, mas a mensagem de erro não é clara e o conteúdo específico não pode ser localizado por enquanto Modifique web.config e adicione uma seção de configuração (compilação), como segue.
visualizar cópia simples para impressão da área de transferência?
... ...
... ...
... ...
... ...
Depurando novamente:
visualizar cópia simples para impressão da área de transferência?
Erro de compilação
Explicação: Ocorreu um erro ao compilar os recursos necessários para atender este pedido. Verifique os seguintes detalhes de erro específicos e modifique o código-fonte adequadamente.
Mensagem de erro do compilador: CS0012: O tipo 'Castle.Windsor.IContainerAccessor' está definido em um assembly que não é referenciado. Uma referência ao assembly "Castle.Windsor, Versão=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc" deve ser adicionada.
Erro de origem:
Linha 134:}
Linha 135:
Linha 136: ASP.global_asax protegido ApplicationInstance {
Linha 137: pegue {
Linha 138: return ((ASP.global_asax)(this.Context.ApplicationInstance));
Arquivo de origem: c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET FilesrootxxxxxxyyyyyyyyApp_Web_default.aspx.zzzzzzz.aaaaaaaa.0.cs Linha: 136
Descrição do erro de compilação: ocorreu um erro durante a compilação dos recursos necessários para atender esta solicitação. Verifique os seguintes detalhes de erro específicos e modifique o código-fonte adequadamente.
Mensagem de erro do compilador: CS0012: O tipo 'Castle.Windsor.IContainerAccessor' está definido em um assembly que não é referenciado. Uma referência ao assembly "Castle.Windsor, Versão=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc" deve ser adicionada.
Erro de origem:
Linha 134:}
Linha 135:
Linha 136: ASP.global_asax protegido ApplicationInstance {
Linha 137: pegue {
Linha 138: return ((ASP.global_asax)(this.Context.ApplicationInstance));
Arquivo de origem: c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET FilesrootxxxxxxyyyyyyyyApp_Web_default.aspx.zzzzzzz.aaaaaaaa.0.cs Linha: 136
Esta mensagem de erro é a mais importante:
Mensagem de erro do compilador: CS0012: O tipo 'Castle.Windsor.IContainerAccessor' está definido em um assembly que não é referenciado. Uma referência ao assembly "Castle.Windsor, Versão=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc" deve ser adicionada.
Obviamente, depois de modificarmos o web.config, o serviço iis reiniciou o projeto web atual e o compilou. A primeira coisa a ser compilada foi global.asax.cs. Uma das variáveis inicializadas também pode ser uma variável estática. Windsor é chamado e csc não consegue encontrar este Castle.Windsor, o que é realmente um processo problemático.
Primeira tentativa: na seção de referência do projeto web, defina Castle.Windsor Originalmente, quando a biblioteca dinâmica foi referenciada diretamente, ela foi enviada para web/bin de forma síncrona. Depois que o GAC foi referenciado, esta saída foi cancelada. . Defina como "Copiar para local". Claro, a compilação após a configuração irá gerar este arquivo: Castle.Windsor para web/bin. Desta forma, a depuração também pode passar porque ele encontrou esta biblioteca dinâmica.
Mas isso não tira nossas dúvidas, ou seja, o Assembly definido em
Segunda tentativa: Pense na seção (compilação) na primeira tentativa, verifique a descrição do msdn e saiba que existe uma definição de
visualizar cópia simples para impressão da área de transferência?
Em seguida, cancele "Copiar para local" para Castle.Windsor no projeto web, recompile e execute.
Todos estão funcionando bem.
Neste ponto, colocamos com sucesso todas as bibliotecas dinâmicas referenciadas por terceiros no GAC.