En el post de hoy vamos a continuar con la cadena de post en los que voy a explicaros los aspectos básicos sobre la programación de módulos para IIS7, que comenzamos el pasado día explicando que era IIS7 y comentando el lenguaje y el entorno de programación necesarios para el desarrollo:
http://www.windowstecnico.com/archive/2009/10/27/creaci-243-n-e-instalaci-243-n-de-m-243-dulos-para-internet-information-services-7-parte-i.aspx
Tras conocer un poco mas sobre el entorno, el siguiente paso será plantearnos: ¿Qué queremos hacer con un módulo en el IIS?. Para aclararos un poco mas esta pregunta os voy a describir los dos tipos de módulos que podemos programar en IIS7:
Módulos de IIS7
En IIS7 podremos instalar 2 tipos de módulos programados por nosotros, en primer lugar podremos crear módulos gráficos, que cuentan con una interfaz gráfica para realizar configuraciones en el IIS y en segundo lugar podremos programar módulos manejadores, que crean un manejador que se encuentra en todo momento escuchando todas las peticiones que llegan al servidor y cuando interceptan una nos permiten acceder a dicha petición y modificarla.
Creación e instalación de un módulo filtrador de peticiones para IIS7
Hoy os voy ha enseñar a programar el 2º de los módulos que antes comentamos, el módulo manejador, y crearemos el ejemplo mas sencillo de módulo, que simplemente interceptará una petición web, y le devolverá al cliente que la realizó la página solicitada pero con una cadena de texto al final.
Instalaciones necesarias:
Para la implementación necesitaremos los siguientes elementos:
1. Microsoft Server 2008, Microsoft Server 2008 R2, Windows Vista o Windows 7
2. Visual Studio 2005-2008
3. IIS 7
4. Asistente para creación de módulos: IIS7 Managed Module Starter Kit que ha producido el IISTeam, y que proporcionará el esqueleto del módulo para el IIS, se puede descargar desde:
http://www.iis.net/downloads/default.aspx?tabid=34&i=1302&g=6
Construcción del módulo:
Tras haber instalado el IIS7 Managed Module Starter Kit, cuando se crea un nuevo proyecto se puede ver como se ha añadido una nueva opción:

La seleccionamos, le damos un nombre, una ubicación y aceptamos. Inmediatamente después se nos abrirá una ventana donde nos resumen el contenido del asistente. Hacemos doble clic en el explorador de soluciones en el fichero MyModule.cs, que modificaremos dependiendo de las necesidades que tengamos en nuestro módulo. Se nos abrirá la ventana con el código del fichero, si expandimos las partes de código minimizadas, nos aparecerá lo siguiente:
using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
namespace MyIIS7Modules
{
/// <summary>
/// The module class.
/// </summary>
public class MyModule : IHttpModule
{
#region IHttpModule Members
/// <summary>
/// Initializes the module, and registers for application events.
/// </summary>
/// <param name="application">
/// The System.Web.HttpApplication instance exposing application events.
/// </param>
public void Init(HttpApplication application)
{
// register for the PreRequestHandlerExecute event:
application.PreRequestHandlerExecute += new EventHandler(OnPreRequestHandlerExecute);
// TODO: add additional application event handlers here
}
/// <summary>
/// Disposes of the resources (other than memory) used by the module.
/// </summary>
public void Dispose()
{
}
#endregion
#region Module Event Handlers
public void OnPreRequestHandlerExecute(Object source, EventArgs e)
{
HttpApplication app = (HttpApplication)source;
HttpContext context = app.Context;
// TODO: implement module functionality here
}
#endregion
}
}
En este fichero debemos hacer 3 modificaciones:
1. Vaciamos todo el contenido de la función “Init”, y añadimos la siguiente línea que nos añadirá el evento manejador:
application.EndRequest += new EventHandler(application_EndRequest);
2. Eliminamos la siguiente función, que no necesitamos para nuestro módulo:
public void OnPreRequestHandlerExecute(Object source, EventArgs e)
{
HttpApplication app = (HttpApplication)source;
HttpContext context = app.Context;
// TODO: implement module functionality here
}
3. Añadimos la siguiente función. En la parte comentada que pone “AÑADIMOS NUESTRO CÓDIGO” es donde deberemos programar las acciones que realizará nuestro módulo, por ejemplo, añadir una línea nueva a todas las peticiones HTML que le llegan al servidor, filtrar su contenido, borrado de comentarios… Para este ejemplo, vamos a añadir una nueva línea de texto, que salga en todas las páginas web que devuelva nuestro servidor a los usuarios. Para ello simplemente llamamos al objeto context y le indicamos que en la respuesta añadiremos un bloque de texto:
void application_EndRequest(object sender, EventArgs e)
{
HttpApplication application = (HttpApplication)sender;
HttpContext context = application.Context;
//AÑADIMOS NUESTRO CÓDIGO
context.Response.Write(“Página modificada por www.windowstecnico.com”);
}
Una vez construido nuestro módulo debemos hacer 2 cosas:
1.) Tenemos que firmar nuestra librería .dll que hemos generado, para ello hacemos doble clic en el explorador de soluciones en la etiqueta “properties” y nos vamos a la pestaña “firma”, marcamos la casilla “firmar el ensamblado” y en seleccionar un archivo de clave de nombre seguro le damos a :

Le asignamos un nombre, por ejemplo, key.snk y desmarcamos la casilla de proteger con contraseña. Con esto ya tenemos nuestra .dll firmada:

2.) Tenemos que añadir un pequeño script, que nos enviará nuestra .dll firmada a la carpeta de ensamblados que se encuentra en la ruta C:\Windows\assembly, desde donde el IIS la recogerá para poder agregarla finalmente cómo modulo. Para ello, sin salirnos de la ventana “properties” nos vamos a la pestaña “Eventos de generación”, y en el cuadro “línea de comandos del evento posterior a la generación” incluimos el siguiente script si estáis usando Visual Studio 2005:
CALL "%VS80COMNTOOLS%\vsvars32.bat" > NULL
gacutil.exe /if "$(TargetPath)"
ó el siguiente si se está usando Visual Studio 2008:
CALL "%VS90COMNTOOLS%\vsvars32.bat" > NULL
gacutil.exe /if "$(TargetPath)"
Quedando finalmente lo siguiente:

Configuración del IIS:
1. Tras ejecutarse los scripts ya tendremos nuestra .dll firmada en la carpeta C:\Windows\assembly y lista para agregarla como modulo (en caso de tener la .dll aparte, bien porque la hemos generado desde otro PC o porque estamos probando una que no hemos generado nosotros, nos bastará con copiar la .dll a esta misma carpeta, seguramente tengamos que aumentar las permisos de esta carpeta antes). Tras esto nos vamos al Administrador de Internet Information Services y hacemos doble clic en el icono “módulos”:

Vamos a la opción “agregar modulo administrado”:

En tipo, en el desplegable, seleccionamos nuestro módulo, y le damos un nombre cualquiera:

Una vez hecho esto, si abrimos un sitio web alojado en el IIS, debería estar funcionando nuestro módulo y mostrarnos en las páginas web la línea de texto que le indicamos:
Espero que os haya gustado el post y que os animéis a programar vuestros propios módulos, y recordad que lo mas importante es tener una buena idea y pensar que todo es programable, solo hacen falta las fuentes de información adecuadas :), el próximo día os hablaré sobre la programación de módulos con interfaz gráfica.
saludos!!
Enviado
oct 30 2009, 01:24
por
Juan Antonio