Hoy vamos a finalizar la cadena de post sobre programación de módulos para IIS7. En este post voy a explicaros cómo programar vuestro propio módulo con interfaz gráfica configurable y cómo instalarlo en el IIS.
¿Para que sirve un módulo gráfico?
Muchos, por no decir la mayoría de los programas requieren de algunos parámetros que necesitan ser configurables para adaptarse a las diferentes situaciones para las que es aplicable el programa que se ha desarrollado. Los módulos del IIS no son menos, y estos no son ni más ni menos que un programa normal, pero embebido dentro de la interfaz del IIS. La programación gráfica de estos programas será exactamente igual a la de otro programa realizado en .NET, con la diferencia de que tendremos que añadirle algunos elementos para que pueda ser reconocido por el IIS. ¡Vamos a ello!
Instalaciones necesarias:
1. Microsoft Server 2008
2. Visual Studio 2005-2008
3. IIS 7
Construcción del módulo:
Una vez tengamos IIS instalado, abrimos el Visual Studio, el primer paso para la construcción de nuestro módulo será crear un nuevo proyecto, seleccionamos crear una nueva Biblioteca de clases, le damos un nombre, por ejemplo: proyecto_i64 y aceptamos:

Eliminamos la clase que nos crea por defecto: Class1.cs, que no la vamos a utilizar.
Ahora tenemos que añadir dos referencias, para ello hacemos clic con el botón derecho del ratón en “References” y pulsamos en “Agregar Referencia”.

Tenemos que incluir las siguientes referencias:
Las encontraremos en la pestaña examinar, en la ruta: c:\windows\system32\inetsrv.
Una vez agregadas las referencias procedemos a firmar nuestra librería, para que el IIS pueda reconocerla como .dll:
1. Para firmar nuestra librería .dll 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 <Nueva..>:

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

3. 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 estáis usando Visual Studio 2008:
| CALL "%VS90COMNTOOLS%\vsvars32.bat" > NULL gacutil.exe /if "$(TargetPath)" |
Quedando finalmente algo cómo lo siguiente:

Una vez hecho esto vamos a proceder a preparar el módulo. Se va a componer de tres partes, las dos primeras son comunes a cualquier tipo de modulo que queramos crear, la tercera tendrá una parte también común y otra que variará dependiendo del módulo que queramos realizar, que será la parte de la interfaz:
1. Module: Inicializa el módulo en nuestro servidor, y lo añade a la consola del IIS para poder seleccionarlo.
2. Module Provider: Donde indicaremos el alcance de nuestro módulo, para todo el servidor, o local a ciertas partes, el tipo de módulo, etc.
3. Module Page: Esta es la parte más importante de nuestro módulo, aquí es donde programaremos la interface gráfica y las acciones del mismo.
Ya que está claro de qué partes se compondrá nuestro módulo, ahora procedemos a montarlo.
Primero crearemos el Module, para ello agregamos un nuevo elemento al proyecto, le damos un nombre, por ejemplo, i64Module, y añadimos el siguiente código, en caso de utilizar otros nombres deberéis cambiar las diferentes llamadas que haya en el código a otras partes del módulo por el nombre que hayáis elegido:
| using System; using Microsoft.Web.Management.Client; using System.Windows.Forms; using Microsoft.Web.Management.Server; namespace proyecto_i64 { internal class i64Module : Module { protected override void Initialize(IServiceProvider serviceProvider, Microsoft.Web.Management.Server.ModuleInfo moduleInfo) { base.Initialize(serviceProvider, moduleInfo); IControlPanel controlPanel = (IControlPanel)GetService(typeof(IControlPanel)); ModulePageInfo modulePageInfo = new ModulePageInfo(this, typeof(i64Page), "Respuestas", "Muestra proc"); controlPanel.RegisterPage(modulePageInfo); } } } |
En Segundo lugar tenemos que montar el Module Provider, volvemos a agregar un nuevo elemento al proyecto, le damos un nombre, por ejemplo: i64Provider, y añadimos el código siguiente:
| using System; using Microsoft.Web.Management.Server; namespace proyecto_i64 { class i64Provider : ModuleProvider { //devuelve el tipo de módulo de servicios que está asociado con el proveedor de módulo public override Type ServiceType { get { return null; } } //metodo que devuelve informacion sobre nuestro modulo public override ModuleDefinition GetModuleDefinition(IManagementContext context) { return new ModuleDefinition(Name, typeof(i64Module).AssemblyQualifiedName); } //decide el alcance del modulo, en nuestro caso, TODO el servidor public override bool SupportsScope(ManagementScope scope) { return true; } } } |
En tercer lugar tenemos que montar el Module Page, volvemos a agregar un Nuevo elemento al proyecto y le damos un nombre, por ejemplo: i64Page. Esta parte es la más compleja, así que vamos a ir por partes, en primer lugar debemos crear el esqueleto, por lo que agregaremos el siguiente código:
| using System; using System.Windows.Forms; using Microsoft.Web.Administration; using Microsoft.Web.Management.Client.Win32; namespace proyecto_i64 { internal class i64Page : ModulePage { Microsoft.Web.Administration.ServerManager manager = new ServerManager(); public i64Page() { InitializeComponent(); } private void InitializeComponent() { } } } |
Una vez agregado, vamos a estudiarlo. Nada más empezar tenemos la siguiente línea de código:
Microsoft.Web.Administration.ServerManager manager = new ServerManager();
Esta línea crea una nueva ServiceManager que podemos utilizar para recuperar las solicitudes de nuestro servidor, en caso de que lo necesitemos. Después ya podemos ver la función que inicializará nuestro módulo. Ahora queremos programar una interface gráfica para nuestro módulo. Para ellos vamos a aprovechar la característica Forms que nos brinda .NET, desde la que podemos agregar todo tipo de elementos gráficos pinchándolos con el botón del ratón y arrastrando desde una toolbar. Para poder utilizar Forms, debemos hacer un pequeño truco, tenemos que cambiar el tipo de clase actual:
internal class i64Page : ModulePage
por el siguiente:
internal class i64Page : Form
Ahora si hacemos doble clic en el explorador de soluciones sobre nuestra clase i64Page, se nos abrirá una ventana con un fondo blanco, este será el aspecto de nuestro módulo, si abrimos el cuadro de herramientas, veremos todos los posibles elementos que le podemos agregar, por ejemplo, podéis agregar un button y un campo label, cambiar fondos de la pantalla, tipos de letra,... Si queremos que alguno de estos elementos interactúe con nuestro módulo haremos doble clic sobre él una vez que lo hayamos agregado, de esta manera se nos añade el sólo al código de nuestra clase i64Page.
Una vez agregados los elementos volvemos a dejar el tipo de la clase como estaba antes, si no, nos dará fallo de compilación:
internal class i64Page : ModulePage
Ahora veremos que se nos han añadido varias partes nuevas a nuestro código. Primero veremos que nada más empezar la clase se nos han incluido la declaración del button y el label, y de los demás elementos que agregasemos antes. Después en la función InitializeComponent(), se nos ha añadido todo el apartado gráfico de los elementos que hemos agregado, esto lo hace internamente el Visual Studio, por lo que directamente procedemos a ignorarlo. Por otro lado vemos que se nos ha añadido una función nueva por cada elemento insertado en el que hicimos doble clic. En estas funciones es donde debemos programar lo que queremos que haga nuestro módulo, por ejemplo en la función button, podemos decirle que muestre un determinado texto en el label.
Ya tenemos nuestro módulo terminado, si lo guardamos y compilamos, el gacutil firmará el ensamblado y podremos acceder a él en la ruta: C:\Windows\assembly. Le buscamos en dicha carpeta y deberemos copiar el key que le ha sido asignado, para ello (pulsamos botón derecho sobre el, propiedades y lo copiamos:

Ahora debemos irnos al fichero Administration.config, en la ruta:
c:\windows\system32\inetsrv\config\Administration.config
Y modificaremos 2 líneas. Para abrirlo veréis que posiblemente no tengáis derechos de administrador, por lo que hay que subir los derechos del fichero o bien abrirlo desde el WordPad por ejemplo ejecutándolo como administrador:
Buscamos la línea <ModuleProviders> dentro del fichero y añadimos después la siguiente línea, sustituyendo la palabra KEY por el key que antes copiamos:
| | |
| <add name="CurrentRequestsUI" type="CurrentRequestsUI.RequestModuleProvider, CurrentRequestsUI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=269f1cc1a4bf892b" /> <add name="proyecto_i64" type="proyecto_i64. i64Provider, proyecto_i64, Version=1.0.0.0, Culture=neutral, PublicKeyToken=KEY" /> | |
Ahora buscamos la línea <modules> y añadimos la siguiente línea:
| <add name="CurrentRequestsUI" /> <add name="proyecto_i64" /> |
Si habéis dado otros nombres al proyecto y al provider deberéis modificarlos por los correspondientes.
Una vez hecho todo, reiniciamos el servidor, para ello abrimos una consola en modo administrador y escribimos: iisreset.
Con esto ya deberíamos tener el módulo funcionando y con un icono seleccionable en nuestro servidor:

Si lo abrimos podremos ver la interface de nuestro módulo. Para restar complejidad al post he decidido no comentar aspectos sobre la interfaz, que son comunes a cualquier otro desarrollo realizado en .NET por lo que para ello podréis acceder a numerosos manuales oficiales donde os explicarán en profundidad esta tarea.
Saludos! Y hasta el próximo post
Enviado
nov 02 2009, 03:21
por
Juan Antonio