site ASP.Net no IIS 7.5 não tendo nova versão de DLL de terceiros

1

Eu tenho um aplicativo da web que estava usando a versão 2.1.0 do SubSonic. Ao adicionar alguns novos recursos, me deparei com um bug nessa versão que foi corrigida no 2.2.0.

Na minha caixa de dev, eu mudo a versão da DLL referenciada e tudo funcionou bem.

Após atualizar o servidor Windows 2008 R2 que executa o IIS 7.5, o bug persistiu.

Eu procurei no servidor e substituí cada instância do SubSonic.dll pela versão mais recente.

Reiniciou o site, o pool de aplicativos e, em seguida, o servidor inteiro.

Eu executei o Process Explorer do SysInternal e verifiquei o processo w3wp.exe para o site e, de acordo com ele, o w3wp.exe está fazendo referência à versão 2.2.0 do SubSonic.dll.

Eu copiei o banco de dados e os arquivos de site daquele servidor Windows 2008 para outro 2008 (um que nunca tinha v2.1.0 carregado) e confirmei que o erro não ocorre lá.

Com base nos sintomas, parece que o servidor está segurando a versão 2.1.0 da DLL, mas não consigo descobrir onde ela está e como me livrar dela.

Informações adicionais:

Eu verifiquei o GAC, sem subdsonic dlls.

Instalado 2.2.0 no GAC usando o gacutil do Windows SDK 6.1

Configure um novo Site e AppPool no servidor e carregue uma nova cópia dos arquivos do site da minha caixa de mensagens.

O site é C # .Net 2.0 usando MVC 1 com nHaml 2.0 para o mecanismo de visualização.

Usado o cygwin find para procurar no sistema de arquivos por qualquer arquivo com o mesmo tamanho que o 2.1 DLL.

Encontrou algumas cópias que a caixa de pesquisa do Windows não tinha, elas estavam apenas em uma pasta de backup, não deveriam estar em uso, excluídas apenas por precaução.

Os únicos arquivos restantes com o mesmo tamanho da versão 2.1.0 são:
./Windows/System32/DriverStore/FileRepository/prnca00z.inf_amd64_neutral_27f402ce616c3ebc/Amd64/CNBDR4_5.DLL ./Windows/winsxs/amd64_microsoft-windows-getuname.resources_31bf3856ad364e35_6.1.7600.16385_pt-br_eca42f29f7e4d0ea/getuname.dll.mui
./Windows/winsxs/amd64_prnca00z.inf_31bf3856ad364e35_6.1.7600.16385_none_ea189c313845a10e/Amd64/CNBDR4_5.DLL

./Windows/winsxs/x86_microsoft-windows-getuname.resources_31bf3856ad364e35_6.1.7600.16385_pt-br_908593a63f875fb4/getuname.dll.mui

Que parecem não ter nada a ver com as DLLs de SubSonic.

Atualização 8-30-2010

O raciocínio em relação ao bug para suspeitar da versão da DLL em uso é o problema:

O erro que está acontecendo é bastante específico e na minha caixa de desenvolvimento quando eu mudo entre 2.1.0 e 2.2.0 da DLL previsivelmente acontece sob 2.1.0 e não 2.2.0.

Eu também coloquei o site em um servidor diferente e ele funciona bem com o 2.2.0, então o trabalho não é exclusivo da minha caixa de desenvolvimento.

Basicamente, na versão 2.1.0 ao fazer uma consulta de resultados paginados, os elementos da cláusula WHERE são duplicados para que a consulta gerada termine com "WHERE CreatedOn > '8-1-2010' AND CreatedOn > '8- 1-2010 '".

Embora redundante, sintaticamente, isso é bom para executar.

Quando você adiciona em um SubQuery é quando dá errado porque o objeto SubQuery tem seu SQL gerado duas vezes e a segunda vez em vez de começar com um WHERE ele inicia com um AND porque um sinalizador booleano no objeto de rastreamento se o WHERE tiver foi iniciado é verdade no início desde a primeira vez que gera o SQL.

Portanto, sob 2.1.0, você obterá "WHERE id IN (ID SELECT FROM WHERE CreatedOn > '8-1-2010') AND id IN (ID SELECT DA tabela AND CreatedOn > '8-1-2010 ') "

No 2.2.0, a cláusula WHERE em uma consulta paginada não repete suas condições e, portanto, a subconsulta não gera uma sintaxe SQL incorreta.

A geração SQL ocorre dentro da DLL e eu posso observar através do SQL Profiler que o 2.1.0 gera a sintaxe ruim, mas quando executo localmente com a 2.2.0 a sintaxe é adequada.

Como esse erro é uma situação tão específica, o site funciona bem em geral, é apenas em uma consulta de pesquisa específica que isso acontece e é muito fácil repetir isso sem código, dados ou estrutura de dados ou outras alterações de ambiente , erros sob 2.1.0 mas não 2.2.0.

Eu não tinha dado detalhes sobre o bug anteriormente, pois não parece relevante para resolver o problema, a resolução deve ser sobre qualquer dll de terceiros carregados a partir do diretório bin de um site asp.net sendo armazenado em cache e não atualizar versão após o pool de aplicativos, reinicializações de serviços e máquinas, criação de novos contêineres, exclusão e reenvio de todos os arquivos do site, etc.

    
por ManiacZX 25.08.2010 / 03:25

5 respostas

0

Encontrei o problema.

Como eu estava fazendo mais testes em várias máquinas, consegui reproduzir o erro finalmente.

Código do site + SubSonic 2.1.0 = erro

Código do site + SubSonic 2.2.0 + SQL Server 2008 = funciona

Código do site + SubSonic 2.2.0 + SQL Server 2008 SP1 = erro

Acontece que no 2.1.0 o erro acontece não importa o que, com o 2.2.0 o problema foi corrigido. Há um erro lógico adicional que, se você estiver usando o SP1 2008, um novo erro ocorre, mas seus sintomas correspondem ao problema original que eu tinha no 2.1.0.

Depois de perceber a diferença de versão do banco de dados SQL e confirmar atualizando minha caixa de desenvolvimento e, em seguida, o erro ocorreu, consegui encontrar algumas informações adicionais agora que sabia que estava analisando um novo problema.

link

link
O problema 7 especificamente, mas 2, 8 e 9 parecem estar intimamente relacionados e provavelmente apresentarão a mesma sintaxe SQL malformada.

    
por 02.09.2010 / 05:32
1

Atualizar : tente excluir o conteúdo de:

%SystemRoot%\Microsoft.NET\Framework<64>\<versionNumber>\Temporary ASP.NET Files

Faça isso para o caminho relevante (dependendo da sua versão do .net e 32/64 bits).

Antes da atualização : não estou familiarizado com o subsônico. Mas talvez isso gere assembly ou procedimentos armazenados. E de alguma forma a versão antiga dessas coisas está sendo mantida mesmo após a atualização da dll. Use o monitor de processo para verificar o que o aplicativo está carregando do disco. E verifique também os procedimentos armazenados, se for relevante.

    
por 28.08.2010 / 21:58
1

Algumas perguntas:

  • Você reconstruiu o site antes de implantá-lo no servidor IIS7 / Win2k8? Ou seja, o site que é implantado como referência 2.1.0 ou versão 2.2.0?
  • A montagem em questão é de nome strong ou de nome fraco? Se for um nome strong, ele será instalado no GAC?
  • A presença do bug é o único motivo para você pensar que o problema está nas versões DLL?
por 29.08.2010 / 13:30
1

Embora eu deva admitir que não li o seu problema em sua totalidade, gostaria de adivinhar qual poderia ser o problema. Eu tentei postar isso como um comentário, mas o site não me permitiria, por algum motivo.

O problema pode não estar na própria DLL subsônica, mas em outra DLL à qual ela faz referência. A versão A do Subsonic.dll pode não referenciar essa outra DLL, mas a versão B pode fazer referência a ela e, portanto, é por isso que você está obtendo um comportamento diferente e não consegue localizar o problema.

Você precisa usar algumas boas ferramentas de depuração para percorrer o fluxo de eventos, um de cada vez, até encontrar algo que não pareça certo.

Eu também acho que essa é a pergunta mais adequada ao StackOverflow. Eu acredito que este é um problema relacionado à programação, especialmente com relação às referências de montagem.

Tente postar no StackOverflow também, você fará com que as pessoas vejam esse problema de um ângulo diferente do que os administradores de servidores usuais.

    
por 01.09.2010 / 00:09
0

Tente o seguinte:

  1. Altere a conta de identidade do Pool de aplicativos para admin.

  2. Verifique se o Windows Server 2008 R2 não é uma versão de depuração.

  3. Confira este link - o IIS7 armazena em cache as informações por um longo tempo, portanto, talvez você queira reconstruir o cache.

link

  1. Aguarde 30 minutos depois de recriar sua solução ... apenas espere e pressione atualizar algumas vezes para tentar reproduzir o erro. Deve finalmente limpar o seu cache.
por 27.08.2010 / 04:57