Error al configurar controladores administrados de 32 bits en la consola de IIS

Este artículo le ayuda a solucionar el problema que se produce al intentar agregar un módulo o controlador administrado a una configuración de sitio web o aplicación web a través del Administrador de Internet Information Services (IIS).

Versión del producto original:   Internet Information Services 8.0, Internet Information Services 8.5
Número KB original:   3194551

Síntomas

Imagine la siguiente situación:

  • Desea agregar un controlador administrado o un módulo administrado a la configuración de uno de los sitios web o aplicaciones web de IIS en un servidor web de IIS.

  • Para ello, seleccione el sitio web de destino o la aplicación web en la consola del Administrador de IIS, haga clic en el icono Asignaciones de controladores o Asignaciones de módulo y, a continuación, haga clic en los vínculos Agregar controlador administrado o Agregar módulo administrado en el panel situado a la derecha de la consola.

Si el servidor ejecuta un sistema operativo de 64 bits y el ensamblado .NET que contiene el controlador administrado o la implementación de módulos administrados que está intentando agregar a la lista de controladores o módulos es un ensamblado compilado para dirigirse solo a entornos de 32 bits, recibirá el siguiente mensaje de error desde la consola del Administrador de IIS:

Se produjo un error al realizar esta operación
Detalles: no se puede llamar a este método durante la fase de inicialización previa al inicio de la aplicación

Causa

Cuando intenta agregar un controlador administrado o un módulo administrado, la consola del Administrador de IIS crea una lista de todas las clases que se encuentran en los ensamblados .NET que provienen de la carpeta de la aplicación y sus /bin dependencias. También en esta lista hay cualquier otro . Ensamblados a los que se hace referencia a LA RED. IIS hace esto para determinar cuál de estas implementa interfaces IHttpHandler o IHttpModule, en función de si se trata de controladores o módulos, respectivamente. Para inspeccionar todas las clases de todos los ensamblados que provienen de la carpeta de la aplicación, la consola del Administrador de IIS crea un dominio de aplicación .NET secundario dentro del proceso de inetmgr.exe en el que se cargarán e inspeccionarán estas clases para la implementación de las /bin interfaces mencionadas anteriormente.

Normalmente, un ensamblado .NET se compila en Microsoft Intermediary Language (MSIL) y está diseñado para ser neutral para la plataforma (lo que significa que puede ejecutarse en plataformas de 64 bits y 32 bits). Puede compilar un ensamblado .NET para que solo se deba a plataformas de 32 bits o solo a plataformas de 64 bits. En este caso, MSIL se compila aún más en código nativo específico para el conjunto de instrucciones del procesador de esa plataforma. Al hacerlo, el ensamblado no puede cargarse en un proceso que no coincida con el bitness de destino de la compilación: intentar cargar un ensamblado destinado a una plataforma de 64 bits dentro de un proceso de 32 bits devuelve un error.

Dado que la consola del Administrador de IIS se ejecuta dentro de un proceso de 64 bits en una versión de Windows de 64 bits (de forma predeterminada), el dominio de aplicación .NET secundario se creará dentro de un proceso de 64 bits. No hay manera de que la consola del Administrador de IIS sepa que algunos de los ensamblados .NET que están dentro de la carpeta /bin de la aplicación se compilan para dirigirse solo a plataformas de 32 bits cuando intenta cargarlos para realizar los cambios de configuración. Si se encuentra un ensamblado destinado a una plataforma de 32 bits, se detiene la carga de ensamblados en el dominio de aplicación .NET secundario dentro del proceso de inetmgr.exe y el error que se describe en la sección Síntomas se muestra en la consola de IIS.

Este comportamiento es por diseño, ya que la consola del Administrador de IIS no puede determinar el bitness de destino para los ensamblados .NET para la aplicación. Por lo tanto, se supone que todos los ensamblados se compilan en MSIL y son independientes de la plataforma que pueden ejecutarse en versiones de 32 bits y 64 bits de Windows.

Solución alternativa

Para evitar este problema, haga coincidir la bitness del proceso inetmgr.exe con la bitness del ensamblado de destino que debe cargarse dentro del dominio de aplicación .NET secundario. Para ello en una versión de 64 bits de Windows, ejecute la siguiente línea de comandos desde un símbolo del sistema con privilegios elevados:

mmc.exe /32 iis.msc 

Esto cargará Microsoft Management Console (MMC) en modo de 32 bits y también cargará el complemento de consola del Administrador de IIS en mmc. Dado que la consola de IIS se ejecuta ahora en un proceso de 32 bits, el dominio de aplicación secundaria .NET se crea dentro de un proceso de 32 bits, que coincidirá con el bitness de destino del ensamblado que está intentando configurar como un controlador administrado o un módulo administrado.

Pasos para reproducir

  1. Cree una clase que implemente o, a continuación, compile el proyecto de biblioteca de clases de Visual Studio a plataformas de 32 bits de destino (Destino de IHttpModule plataforma: x86 en la configuración de compilación IHttpHandler del proyecto).

  2. Tome el ensamblado .NET resultante e impleméntelo en la carpeta bin de una aplicación web o sitio web existente en un sistema operativo de 64 bits que también ejecuta IIS.

  3. Vaya al administrador de IIS e intente agregar un controlador administrado o un módulo administrado a través de la interfaz y recibirá el error.