Por que o modo de 32 bits é necessário no IIS7.5 para meu aplicativo?

4

Eu tenho um aplicativo da web .net4 em execução em um servidor de 64 bits 2008. Eu só posso fazê-lo funcionar quando eu definir o pool de aplicativos para Ativar o aplicativo de 32 bits para true. Todas as dlls são compiladas para .net4 (verificadas com corflags.exe). Como posso descobrir por que o Enable 32-bit é necessário?

A mensagem de erro do log de eventos ao iniciar como um pool de aplicativos de 64 bits

Event code: 3008 Event message: A configuration error has occurred. Event time: 2011-03-16 08:55:46 Event time (UTC): 2011-03-16 07:55:46 Event ID: 3c209480ff1c4495bede2e26924be46a Event sequence: 1 Event occurrence: 1 Event detail code: 0

Application information: Application domain: removed Trust level: Full Application Virtual Path: removed Application Path: removed Machine name: NMLABB-EXT01

Process information: Process ID: 4324 Process name: w3wp.exe Account name: removed

Exception information: Exception type: ConfigurationErrorsException Exception message: Could not load file or assembly 'System.Data' or one of its dependencies. An attempt was made to load a program with an incorrect format. at System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) at System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory() at System.Web.Configuration.AssemblyInfo.get_AssemblyInternal() at System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig) at System.Web.Compilation.BuildManager.CallPreStartInitMethods() at System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException)

Could not load file or assembly 'System.Data' or one of its dependencies. An attempt was made to load a program with an incorrect format. at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection, Boolean suppressSecurityChecks) at System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) at System.Reflection.Assembly.Load(String assemblyString) at System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective)

Request information: Request URL: "our url" Request path: "url" User host address: ip-adddress User:
Is authenticated: False Authentication Type:
Thread account name: "app-pool"

Thread information: Thread ID: 6 Thread account name: "app-pool" Is impersonating: False Stack trace: at System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) at System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory() at System.Web.Configuration.AssemblyInfo.get_AssemblyInternal() at System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig) at System.Web.Compilation.BuildManager.CallPreStartInitMethods() at System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException)

Custom event details:

    
por Jonas Lincoln 15.03.2011 / 16:37

1 resposta

2

Provavelmente, porque um ou mais dos componentes usados pelo seu aplicativo são de 32 bits.

Ou porque um ou mais componentes usados pelo seu aplicativo não são encontrados quando você alterna o modo do Pool de Aplicativos, devido à sua densidade e ao redirecionamento do sistema de arquivos.

Em geral, o IIS dividirá Módulos e Manipuladores em binários de 32 e 64 bits e impedirá que um bitness ou outro veja o outro bitness com as condições prévias bitness32 ou bitness64.

Exemplo de destaque:

<modules> <module name="something" path="c:\program files\something.dll" precondition="bitness64"> </modules>

Se você alterar o pool de aplicativos para 32 bits, lembre-se:

  • bitness64 não será verdadeiro
  • aplicativos de 64 bits não são encontrados em locais de arquivos; Aplicativos de 32 bits podem ser (Arquivos de Programas (x86) ou System32 (que redireciona para o SysWow64))

o mesmo módulo / manipulador pode ter uma entrada como esta:

<modules> <module name="something32" path="c:\program files\something32.dll" precondition="bitness32"> </modules>

O qual funcionará apenas se o arquivo algo32.dll estiver em Arquivos de programas (x86).

Os logs de eventos devem ajudá-lo a rastrear qual módulo está sendo problemático, se for um módulo ou falha no carregamento do manipulador.

Se seus módulos ou manipuladores não especificarem uma pré-condição de bitness e puderem usar caminhos diferentes quando executados a partir de um bitness diferente devido ao redirecionamento, você terá seu problema. (os logs de eventos geralmente apontam para o que não foi carregado quando um pool de aplicativos não é iniciado).

Veja também:

por 16.03.2011 / 02:58