2012-02-09 19 views
5

He creado una pequeña Biblioteca de clases, con un HttpModule que usa un filtro para agregar algo de HTML a cada página solicitada servida por IIS7.El módulo registrado en IIS7 no funciona

Lo probé primero registrando el módulo en el web.config en un sitio web de prueba, y funciona como debería, pero solo en esa aplicación.

He generado un dll y he creado un conjunto con nombre fuerte.

Necesito de alguna manera agregar este ensamblaje como un módulo en IIS a nivel de servidor, de modo que funcione para todas las solicitudes, en todas las aplicaciones y para el contenido que no sea de formato.

Hasta ahora, he intentado agregar el .dll como un módulo nativo. Esto no funciona Está en la lista de módulos nativos, pero no funciona.

He instalado el .dll en el GAC.

Al seguir leyendo, parece que tengo que agregar el ensamblaje como un módulo administrado, y luego lo selecciono en la lista desplegable en "agregar módulo administrado" en IIS.

Para esto, he intentado usar la herramienta de línea de comandos appcmd, escribiendo: "Agregar módulo/nombre: string/Tipo: Cadena/Condición previa: cadena"

he tenido ningún éxito haciendo esto, puesto que puede' t averiguar qué establecer como tipo y precondición.

Como he leído, los módulos registrados en IIS deberían funcionar para todas las aplicaciones en todos los sitios y todas las solicitudes.

El punto es evitar tener que registrar el módulo en cada archivo web.config de las aplicaciones.

¿Alguna idea?

+0

http://learn.iis.net/page.aspx/244/how-to-take-advantage-of-the-iis-integrated-pipeline/ –

+0

He editado mi respuesta con más ayuda sobre cómo usarla comando appcmd No lo agregue como módulo nativo, si tiene problemas con la línea de comandos, use el Administrador de IIS para agregar ** Módulo administrado **, pasos de cómo en mi respuesta. – Tomek

Respuesta

6

Después de trabajar con esto por un tiempo, logré hacerlo funcionar.

Instalar el conjunto en .NET 4.0 GAC no estará disponible en el menú desplegable de tipo en el administrador de IIS en "Agregar módulo administrado".

Lo que tenía que hacer era:

Crear .NET 4.0 Biblioteca de clases, y compilarlo como un denominado ensamblado

instalarlo en .NET 4.0 GAC mediante la gacutil, situada en archivos de programa (x86) \ Microsoft SDKs \ Windows \ v7.0A \ bin \ netfx 4.0 Herramientas

(O Hacer una compilación de Visual Studio, firmar e instalar el montaje de forma automática)

Añadir esta línea bajo <modules> en applicationHost. config: (es h como que hacer manualmente, no se puede hacer en el administrador)

<add name="MyName" type="NameSpace.ClassName" preCondition="managedHandler,runtimeVersionv4.0" /> 

Esto hace que el funcionamiento del módulo de peticiones a los sitios desarrollados en .NET 4.

Parece, sin embargo, que las solicitudes de los sitios desarrollados en las versiones de pre .net 4 no pueden usar un módulo creado en .net 4.0. Por lo tanto, si realiza solicitudes de páginas en un sitio creado en .net 3.5, el módulo no funcionará.

Otra observación:

Después de haber agregado el módulo de IIS a través del archivo applicationHost.config, si se abre el administrador de IIS, seleccione el nombre del servidor en conexiones y haga clic en módulos. Verá el módulo .net 4 en la lista.

Haz doble clic en él y verás la configuración para él. Verá que "Invocar solo para solicitudes a ASP".Las aplicaciones de red o los manejadores administrados "están marcados. Si lo desmarcas, y presionas aceptar, obtendrás un error que dice que el ensamblado no se ha instalado en el GAC.

¿Pero no acabo de instalarlo? con éxito en .net 4 GAC? Y no acabo de ver el módulo ejecutarse en una solicitud?

Si sigue adelante y guarda la configuración de todos modos, obtendrá un error de tiempo de ejecución, y si se mira en applicationHost.config , verá que la configuración del módulo previamente agregado manualmente ha cambiado.

Pero, ¿qué ocurre si deseo "Invocar solo para solicitudes a aplicaciones ASP.NET o controladores administrados?

+0

Gracias, Soeren, fue de mucha ayuda leer tu pregunta y respuestas aquí. Tengo una pregunta sobre los próximos pasos. ¿Cómo colocarías un archivo de configuración para tu módulo? (ya que se está ejecutando sin una aplicación específica). Quiero decir, ¿cuál es la forma estándar de poner algún tipo de archivo de configuración para un módulo de nivel de servidor? – Bakhshi

+0

Hola, me parece útil, pero ¿de dónde es este archivo applicationHost.config del que está hablando ... También estoy enfrentando un problema similar ... – SutharMonil

2

Tiene que agregar un módulo a nivel de servidor. Puede hacerlo desde la línea de comandos:

appcmd add module /name:string /type:string /preCondition:string 

Para obtener la línea de comandos ayudar a ejecutar: appcmd add module /?
En resumen, debe verse como:

appcmd add module /name:AnyNameOfYourChoice /type:YourClassNameSpace.YourClassName 

/preContition parámetro es opcional.

Más detalles here.

O

hacerlo desde el Administrador de IIS, vaya al nodo del servidor -> Módulos -> Agregar módulo Gestionado
Más detalles here. (parte inferior de la página)

+0

Gracias. Como habrás notado, edité mi pregunta un par de veces porque quería ser lo más específico posible. Voy a probar tus sugerencias y volver. – Soeren

+0

El ensamblado ahora se agrega como un módulo administrado, y ahora recibo un error que dice: "System.Web.HttpException: Could not load type ..." que sugiere que no se puede encontrar el dll. ¿El dll necesita estar ubicado en un lugar específico? Lo he copiado en la carpeta "inetsrv". El ensamblaje también está instalado en GAC. – Soeren

+0

¿Puedes intentar agregarlo a través del Administrador de IIS? – Tomek

5

Ahora puedo ejecutar el módulo en cada solicitud. La razón por la que no funcionó antes fue un error totalmente no relacionado de mi parte. Por lo tanto, los pasos a seguir para hacer que funcione es:

  1. escribir el código que desea ejecutar en cada petición, como .NET 3.5 Biblioteca de clases.
  2. Compílo como un conjunto de nombre seguro.
  3. Instale el conjunto en el GAC.
  4. En el administrador de IIS7, seleccione el nombre del servidor en las conexiones, haga clic en Módulos, haga clic en "Agregar módulo administrado" en las acciones.
  5. escribe un nombre para el módulo y elige el ensamblado que acabas de instalar en el menú desplegable de tipo.
  6. Asegúrese de que el sitio utiliza un grupo de aplicaciones que se ejecuta en modo integrado.

Por supuesto, no siempre es una buena idea dejar que todo el código se ejecute en todas las solicitudes, por lo que puede necesitar filtrar algunos de los archivos solicitados.

¡Una pregunta permanece sin embargo!

Ahora hay dos GAC, Microsoft.NET para .NET 4.0 y Windows GAC para pre .net 4.0. Como creé mi ensamblado en .net 3.5, se instaló en Windows GAC y, por lo tanto, estaba disponible en el menú desplegable de tipo en el administrador de IIS.

Cuando creé mi ensamblado en .NET 4.0, se instaló en el GAC de Microsoft.NET, y como resultado, NO estaba disponible en el menú desplegable de tipo en el Administrador de IIS.

La pregunta es: ¿cómo se agrega un ensamblado .NET 4.0 como un módulo administrado en IIS7 y se ejecuta como mi módulo administrado 3.5?

Esto debe ser posible, ¿no?

+0

La versión del Administrador de IIS incluida con IIS 7 se creó en .NET 3.5. Por lo tanto, no podría cargar nada de .NET 4 GAC. –

Cuestiones relacionadas