jueves, 25 de junio de 2009

Programación de módulos para IIS7 (III de IV)

Programación de módulos para IIS7 (I de IV)
Programación de módulos para IIS7 (II de IV)
Programación de módulos para IIS7 (III de IV)

Hoy vamos a continuar con los post sobre programación de módulos para IIS7, que comenzamos anteriormente con una pequeña introducción en el tema y explicando las instalaciones necesarias, y con un manual sobre la programación de módulos manejadores.

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:

clip_image002

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”.

clip_image004

Tenemos que incluir las siguientes referencias:

· Microsoft.Web.Administration.dll.

· Microsoft.Web.Management.dll.

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..>:

clip_image006

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:

clip_image007

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:

clip_image009

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. Despues 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 boton del raton 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//ModulePage

Ahora si hacemos doble clic en el explorador de soluciones sobre nuestra clase i64Page, se nos abrirá una ventana con un fondo blanco, este sera el aspecto de nuestro módulo, si abrimos el cuadro de herramientas, veremos todos los posibles elementos que le podemos agregar, por ejemplo, podeis 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. En el post de hoy simplemente vamos a hablar sobre la creación de modulos con interfaz y su instalación, en el siguiente post comentaremos aspectos sobre las interfaces gráficas, iconos y demás elementos mas en detalle.

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 mas empezar la clase se nos han incluido la declaración del button y el label, y de los demás elementos que agregasemos antes. Despues 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 funcion 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. La buscamos en dicha carpeta y copiamos el key (pulsamos botón derecho sobre ella, propiedades y lo copiamos):

clip_image011

Ahora debemos irnos al fichero Administration.config, en la ruta:

c:\windows\system32\inetsrv\config\Administration.config

Y modificaremos 2 lineas. Para abrirlo vereis que posiblemente no tengais derechos de administrador, por lo que hay que subir los derechos del fichero o bien abrirlo desde el WordPad ejecutandolo como administrador:

Buscamos la línea <ModuleProviders> dentro del fichero y añadimos después la siguiente línea, donde pone KEY pondremos la 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 debereis 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:

clip_image013

Si lo abrimos podremos ver la interface de nuestro módulo. Para restar complejidad al post he decidido no comentar aspectos sobre la interfaz, la modificación de los iconos del IIS y que utilidades tiene una interfaz en el IIS. En el próximo post, utilizaremos todo lo aprendido en los post anteriores, para crear un módulo de securización, utilizando un módulo manejador, un módulo gráfico y una base de datos SQL Server para almacenar los datos configurables del módulo, y la información recogida por el módulo manejador, y lo adornaremos con iconos y una bonita interfaz, pero por el momento ir practicando y creándoos vuestro módulo gráfico, y el próximo día nos ponemos manos a la obra para programar una plataforma de securización para nuestro IIS :), nos vemos en el siguiente post!

Saludos!

6 comentarios:

Emmanuel dijo...

hola que tal de nuevo, esta muy bueno el post,sabes me han dejado como tarea que programe servicios web en c# para despues acceder a ellos a travez de una aplicacion para pocket pc 2003 no podrias poner un tutorial sobre como hacer mas o menos los servicios web?

Juan Antonio Calles dijo...

Si concretas un poco mas la pregunta quizas pueda darte alguna idea de como hacerlo, ¿que quieres hacer un modulo en el IIS que te permita intercambiar cosas entre el servidor y un pocket pc?

un saludo! gracias por el comentario

Emmanuel dijo...

hola de nuevo jejeje, bien, te explico, lo que quiero hacer es una aplicacion para pocket pc en visual studio 2008 el lenguaje sera c# esta aplicacion debe acceder a servicios web del IIS un ejemplo seria un login y password, la aplicacion solamente la vamos a correr en el emulador, espero explicarme esta vez jejejej soy un poco torpe para eso xD

Juan Antonio Calles dijo...

Nunca he programado para un pocket PC lo siento, imagino que desde una PDA o similar querras loguearte en el servidor (en una web o un similar) pero no puedo ayudarte. Es una de mis asignaturas pendientes la programación para dispositivos moviles.

un saludo

Ivan dijo...

Hola, esta rebueno la programacion de modulos, estoy programando hace poco en asp.net y me a gustado mucho lo que has enseñado.
Ahora la parte IV no esta, o no la hiciste.
Saludos

Juan Antonio Calles dijo...

Me alegro de que te guste @Iván, el post IV aún no lo he hecho, para el mes que viene quería plantearme hacerlo, ahora ando algo limitado de tiempo, estad atentos al RSS ;)

un saludo!