Problema con aplicaciones Asp.net de 32 bits en servidores de 64 bits

En ocasiones puede ocurrir que una aplicación Asp.net utilice componentes de 32 bits o filtros ISAPI de 32 bits desarrollados por terceros y que no podemos recompilar para 64 bits estos componentes. El resultado es que la aplicación ‘casca’ estrepitosamente cuando la intentamos acceder a su sitio web. Esto me ocurrio ayer mismito con una aplicación que utiliza un componente de informes compilado únicamente para plataformas de 32 bits. Los pasos a dar no son simples y he tenido que ir rascando información aquí y allí, así que os dejo las indicaciones para solucionar el problema, por si alguien más lo sufre.

Síntomas:

En equipos de 64 bits tras instalar la aplicación, no podremos acceder al sitio web de la aplicación. Los errores que podemos recibir son del estilo:

Server Error in ‘/TuAplicacionWeb’ Application.


no es una aplicación Win32 válida. (Exception from HRESULT: 0x800700C1)

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.BadImageFormatException: no es una aplicación Win32 válida. (Exception from HRESULT: 0x800700C1)

O bien un error 503 de HTTP, Service Unavailable. O en otras ocasiones un error 153 de Windows.

Solución:

Debemos asegurarnos de que tenemos el Service Pack 1 de Windows 2003 Server 64 bits instalado.

Los pasos a dar son:

1) Configurar IIS para que no se ejecute en modo ‘IIS 5 Isolation Mode’, para ello ejecutamos estos comandos:

CSCRIPT %SYSTEMDRIVE%InetpubAdminScriptsadsutil.vbs SET W3SVC/IIs5IsolationModeEnabled 0

NET STOP HttpFilter /y

NET START W3SVC

2) Configurar IIS para que corra el proceso w3wp.exe como proceso de 32 bit, para ello ejecutamos el siguiente comando.

CSCRIPT %SYSTEMDRIVE%InetpubAdminScriptsadsutil.vbs SET W3SVC/AppPools/Enable32bitAppOnWin64 1

3) Puesto que no podemos cargar un filtro ISAPI de 64 bits en un proceso de 32 bits debemos asegurarnos de utilizamos el ISAPI de Asp.Net de 32 bits.

Si no hacemos este paso en el log de eventos prodremos ver

Event Type: Error
Event Source: W3SVC-WP
Event Category: None
Event ID: 2268
Description:
Could not load all ISAPI filters for site/service. Therefore startup aborted.
Data: 0000: c1 00 00 00

O recibir el error %1 is not a valid Win32 application o Service Unavailable al intentar acceder al sitio web de la aplicación.

Para que IIS utilice el filtro ISAPI de Asp.Net de 32 bits tenemos que ejecutar el siguiente comando:

%windir%Microsoft.NETFrameworkv2.0.50727ASPNET_REGIIS.EXE -I –Enable

4) Debemos reiniciar el application pool en el que se ejecuta nuestra aplicación web. Una manera muy comoda es ejecutar el comando iisreset que reinicia completamente nuestro Internet Information Server y por lo tanto todos los application pools.

Más información sobre el tema (en inglés):

David Wang : HOWTO: Diagnose one cause of 503 Service Unavailable on IIS6

David Wang : HOWTO: Diagnose one cause of 503 Service Unavailable on IIS6 on 64bit Windows

David Wang : HOWTO: Diagnose One Cause of «%1 is not a valid Win32 application» on IIS6 on 64bit Windows

David Wang : HOWTO: Diagnose one cause of W3SVC failing to start with Win32 Error 193 on 64bit Windows

How to switch between the 32-bit versions of ASP.NET 1.1 and the 64-bit version of ASP.NET 2.0 on a 64-bit version of Windows

Windows Server 2003 SP1 enables WOW64 compatibility for 32-bit Web applications in IIS 6.0

12 comentarios sobre “Problema con aplicaciones Asp.net de 32 bits en servidores de 64 bits”

  1. hey Rodrigo y no solo eso !!!
    si has desarrollado una aplicacion windows y tratas a los handles de las windows (redundante) con Int32 … pues imaginate eso en una maquina de 64 bits 😀 (ojo solucion simple, refactorizar por un abstracto: Int)

    ya lo comentaba con un compañero hace un tiempo, el paso de 32b a 64b no será tan transparente como uno quisiera, pero es un paso necesario 😀

    Saludos

  2. Anónimo, evidentemente la solución es compilar todos los coponentes de la aplicación para 64 bits, pero eso no siempre es posible, sobre todo con componentes suministrados por terceros, con ciertas librerias para comunicar con hardaware específico, etc…

  3. Justamente hace un par de semanas migramos un servidor donde algunas aplicaciones web utilizaban .dll de win32, algunas ASP.NET y otras ASP Clasico asi que no atoramos un poco pero hicimos (un amigo que es el encargado de la infraestructura) lo que justamente comenta Rodrigo.
    Bienvenido un tutorial mas a mano en Geeks.ms 😉

  4. Otra opción es poner los componentes de terceros de 32 bits dentro de com+ como server applications. Entonces el proceso del IIS en 64 bits es capaz de cargar los coms en 32 bits, ya que estos se cargan en procesos separados.
    Saludos!

  5. Como dices…la terotia tiene buena pinta!!! Voy a problar si funciona, tengo unos servidores WEB Windows 2003 32-bits, conn unas cuantas SITES, en ASP.net lo quiero migrar a Windows 2003 64-bits, ya contare como funciona??? Saludos!!!

  6. Tengo un problema similar
    Estoy corriendo una aplicación en ASP.NET 2.0 con un componente externo DataWindow.NET, pero me manda error al cargar las librerías del DataWindow, creoque es por q el servidor es Windows 2003 Server de 64 bit’s. Alguien ha tenido alguna experiencia con esto ??

  7. Yo tengo un servidor 2008 server, tengo una aplicacion web y utiliza una herramienta hecha por terceros, esta herramienta esta implementada en 32 bits y mi win server 2008 es 64 bits, la aplicacion web no funciona correctamente, ademas que mi servidor no esta tomando los recursos completamente. Los pasos que mencionan ustedes serán los mismos para win server 2008. ???????

Responder a rcorral Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *