Compartir a través de


Ejemplo de extensibilidad de un extremo a otro para desarrolladores de IIS 7.0

por Saad Ladki

IIS 7 y versiones posteriores se crean con una arquitectura completamente modular, sobre las API de extensibilidad enriquecidas. Esto permite a los desarrolladores agregar, quitar e incluso reemplazar componentes de IIS integrados por otros diseñados a mano, especialmente adecuados para cualquier sitio web determinado. Nunca ha sido tan fácil introducir código en profundidad a la canalización principal de IIS y ampliarlo de formas que antes eran imposibles.

Para poner algunos ejemplos: algunas líneas de código permiten a los desarrolladores escribir módulos o controladores que proporcionan nuevos esquemas de autenticación y autorización, realizar análisis en tiempo de ejecución o análisis de seguridad de las solicitudes entrantes e inspeccionar las respuestas. Pero para proporcionar un valor añadido real, estos módulos deben administrarse mediante interfaces de programación, herramientas de línea de comandos y una interfaz de usuario.

Esta notas del producto son un ejemplo completo de cómo ampliar el servidor web de IIS con un controlador de solicitudes personalizado. Muestra cómo agregar compatibilidad con la API y la línea de comandos para la configuración de este controlador y cómo escribir un módulo de interfaz de usuario conectado a la interfaz de administración de IIS.

La solución se ha probado en Windows Vista y Windows Server® 2008 Beta 3. Se actualizará una vez que la versión final de Windows Server 2008 esté disponible.

Característica establecida

  • El controlador administrado inserta un mensaje de copyright en archivos de imagen
  • La característica de mensaje de copyright está controlada por la configuración y usa el nuevo sistema de configuración de IIS
  • La configuración se puede esquematizar y hacer accesible para las API de configuración, el scripting WMI y las herramientas de línea de comandos de IIS
  • El módulo de extensión de interfaz de usuario permite la configuración de la característica de mensaje de copyright a través de la interfaz de usuario de IIS

Requisitos previos

Para seguir los pasos descritos en este documento, debe instalarse el siguiente software:

ASP.NET

Instale ASP.NET a través del Panel de control de Windows Vista. Seleccione "Programas" - "Activar o desactivar las características de Windows". A continuación, abra "Internet Information Services" - "World Wide Web Services" - Características de desarrollo de aplicaciones" y active "ASP.NET.

Si tiene una compilación de Windows Server 2008. abra "Administrador del servidor" - "Administrar roles" y seleccione "Servidor web (IIS)". Haga clic en "Agregar servicios de rol". En "Desarrollo de aplicaciones", active "ASP.NET".

También debe instalar "Scripts y herramientas de administración de IIS" para aprovechar la extensibilidad de WMI en IIS. Para ello, seleccione "Programas" - "Activar o desactivar características de Windows". A continuación, abra "Internet Information Services" - "Herramientas de administración web" y active "Scripts y herramientas de administración de IIS".

Si tiene una compilación de Windows Server 2008, abra "Administrador del servidor" - "Roles" y seleccione "Servidor web (IIS)". Haga clic en "Agregar servicios de rol". En "Herramientas de administración web" active "Scripts y herramientas de administración de IIS".

Visual C# Express Edition o Visual Studio 2005

Para el módulo de interfaz de usuario, necesita una herramienta de desarrollo de C#. Si no tiene una copia de Visual Studio 2005, descargue Visual Studio de forma gratuita.

Problemas de control de cuentas de usuario

Protección de cuentas de usuario de Windows Vista quita los privilegios de administrador del token de acceso. De forma predeterminada, no tendrá acceso a ubicaciones de contenido y configuración de IIS. Para solucionar este problema, se recomienda pasar por este artículo mediante un símbolo del sistema con privilegios elevados.

Para iniciar un símbolo del sistema con privilegios elevados, vaya al menú "Inicio", haga clic en "Todos los programas" - "Accesorios". Haga clic con el botón secundario en Símbolo del sistema y elija Ejecutar como administrador. Confirme el mensaje de elevación.

Escenario

En el siguiente ejemplo se decoran dinámicamente las imágenes que sirve nuestro servidor web con información de copyright en la esquina inferior izquierda, como se muestra en la figura 1.

Screenshot of the web page displaying an image of snow covered rocky mountains on the backdrop of a cloudy sky.
Figura 1: módulo de derechos de autor de imagen en acción

Usamos código administrado para desarrollar el controlador que decora las imágenes. Como parte del ejemplo, también especificamos la configuración de este controlador y la almacenamos en el almacén de configuración de IIS. Por último, desarrollaremos un complemento de interfaz de usuario para el administrador de IIS.

El almacén de configuración de IIS se puede ampliar simplemente copiando un archivo de esquema en el directorio de esquema de IIS. El esquema declara el nombre de la nueva sección de configuración y sus atributos, tipos y valores predeterminados. En nuestro ejemplo, declaramos una nueva sección de configuración denominada imageCopyright. Reside en el grupo de configuración system.webServer. Sus propiedades son:

  • Marca booleana que habilita o deshabilita la funcionalidad imageCopyright
  • Atributo de cadena que contiene el mensaje de copyright
  • Atributo de color que especifica el color del mensaje de copyright

Declaración de esquema

Guarde la siguiente definición de esquema como imagecopyright.xml en %windir%\system32\inetsrv\config\schema:

<configSchema>
    <sectionSchema name="system.webServer/imageCopyright">
        <attribute name="enabled" type="bool" defaultValue="false" />
        <attribute name="message" type="string" defaultValue="Your Copyright Message" />
        <attribute name="color" type="string" defaultValue="Red"/> 
   </sectionSchema>
</configSchema>

Si recibe un mensaje de "acceso denegado", no lo hizo desde el símbolo del sistema con privilegios elevados. Una vez agregado el archivo de esquema, el esquema debe declararse en el archivo applicationhost.config. Agregue el siguiente XML a %windir%\system32\inetsrv\config\applicationhost.config

<configSections>
...
<sectionGroup name="system.webServer">
<section name="imageCopyright"  overrideModeDefault="Allow"/>
...    
</sectionGroup>
</configSections>

Configúrelo

El proceso se ha completado. Puede establecer las nuevas opciones de configuración a través de la línea de comandos o directamente dentro de applicationhost.config o web.config. Pruébelo. Abra un shell de comandos y escriba lo siguiente:

<system.webServer>
    <imageCopyright />
</system.webServer>

La salida muestra que se reconoció la sección de configuración, con su configuración predeterminada:

%windir%\system32\inetsrv\appcmd set config -section:system.webServer/imageCopyright 

/color:yellow /message:"Copyright (C) Contoso.COM" /enabled:true

Ahora agregue sus opciones de configuración a través de appcmd.exe, por ejemplo.

%windir%\system32\inetsrv\appcmd set config -section:system.webServer/imageCopyright 

/color:yellow /message:"Copyright (C) Contoso.COM" /enabled:true

Compruebe si la configuración se guardó mediante la ejecución de:

%windir%\system32\inetsrv\appcmd list config -section:system.webServer/imageCopyright

Consulte la configuración guardada:

<system.webServer> 
    <imageCopyright enabled="true" message="Copyright (C) Contoso.COM" color="yellow" />
</system.webServer>

Configuración de imageCopyright mediante script

Nota:

Hacer que la configuración del controlador imageCopyright esté disponible para el scripting WMI es opcional. Puede ir directamente a "Paso 2: Extensibilidad básica: controlador de derechos de autor de la imagen" sin afectar a los pasos restantes.

Para que la configuración del controlador imageCopyright esté disponible para scripts WMI, complete los siguientes pasos:

  • Instalación de compatibilidad con WMI de IIS
  • Creación del archivo imageCopyright.mof
  • Inclusión del archivo imageCopyright.mof en webadministration.mof y compilación de los archivos de esquema WMI
  • Escritura y ejecución del script

Instalación de compatibilidad con WMI de IIS

La instalación predeterminada de IIS no incluye los componentes de scripting de WMI. Debe agregarlos.

Instalación de la compatibilidad con WMI en las SKU de cliente de Vista

Instale "Scripts y herramientas de administración de IIS" a través del Panel de control de Windows Vista. Seleccione "Programas" - "Activar o desactivar las características de Windows". A continuación, abra "Internet Information Services" - "Herramientas de administración web" y active "Scripts y herramientas de administración de IIS".

Instalación de compatibilidad con WMI en SKU de Windows Server 2008

Si tiene una compilación de Windows Server 2008, abra "Administrador del servidor" - "Roles" y seleccione "Servidor web (IIS)". Haga clic en "Agregar servicios de rol". En "Herramientas de administración" active "Scripts y herramientas de administración de IIS".

Creación del archivo imageCopyright.mof

La declaración de esquema de las propiedades WMI es muy similar a la declaración de esquema de las propiedades de IIS del paso anterior. Los esquemas WMI se declaran en archivos .mof y se compilan mediante una herramienta denominada mofcomp. Mofcomp agrega la declaración de esquema al repositorio WMI.

Tareas para agregar la información del esquema

Abra una instancia del Bloc de notas y copie las siguientes líneas en ella:

#pragma AUTORECOVER
#pragma namespace("\\\\.\\Root\\WebAdministration")
[            
    dynamic : ToInstance ToSubClass,
    provider("WebAdministrationProvider") : ToInstance ToSubClass,
    Description("imageCopyright Section") : ToSubClass,
    Locale(1033) : ToInstance ToSubClass,
    factory_clsid("{901a70b2-0f7a-44ea-b97b-1e9299dec8ca}"),
    section_path("system.webServer/imageCopyright"),
    SupportsUpdate
]
 
class imageCopyright : ConfigurationSection
{      
    [
        read: ToSubClass ToInstance,
        write: ToSubClass ToInstance,
        DefaultValue("False"): ToSubClass ToInstance,
        Description("To be written"): ToSubClass ToInstance
    ]
    boolean Enabled;
  
    [
        read: ToSubClass ToInstance,
        write: ToSubClass ToInstance,
        DefaultValue("Your Copyright Message"): ToSubClass ToInstance,
        Description("Copyright Message"): ToSubClass ToInstance
    ]
    string Message;

    [
        read: ToSubClass ToInstance,
        write: ToSubClass ToInstance,
        DefaultValue("Yellow"): ToSubClass ToInstance,
        Description("Color of Copyright Message"): ToSubClass ToInstance
    ]
    string Color;
};

La declaración de esquema contiene las mismas entradas que imageCopyright.xml en el paso anterior, es decir, el nombre y el tipo de la configuración y su valor predeterminado. Guarde el archivo como %windir%\system32\inetsrv\imageCopyright.mof.

Compilación de archivos de esquema WMI

Compile imageCopyright.mof ejecutando el siguiente comando

mofcomp webadministration.mof

El script de WMI

Mofcomp agregó el esquema imageCopyright al repositorio WMI. Establezca las opciones de configuración de IIS mediante el script del proveedor WMI de IIS. Este es un ejemplo:

Tareas

Abra una instancia de NOTEPAD y copie las siguientes líneas en él. Guarde el archivo como SetCopyrightConfig.vbs:

Set oIIS = GetObject("winmgmts:root\WebAdministration")        
Set oSection = oIIS.Get("ImageCopyright.Path='MACHINE/WEBROOT/APPHOST/Default Web Site',Location=''")
oSection.Enabled = true
oSection.Message = "Copyright (C) IIS7 Team - Date: " & date
oSection.Color = "White"
oSection.Put_

Se trata de un script WMI estándar que se conecta al proveedor WMI de IIS. Obtiene la sección de configuración en la ubicación especificada ("Sitio web predeterminado") y cambia sus valores. La llamada Put_ guardará los cambios en el disco.

Si ejecuta el script, agrega el mensaje de copyright con la fecha actual en %systemdrive%\inetpub\wwwroot\web.config. Eche un vistazo.

A continuación, agregue el propio controlador de derechos de autor de la imagen.

Un controlador es un fragmento de código que se ejecuta cuando la solicitud coincide con un patrón determinado, normalmente una extensión de archivo. Las solicitudes que terminan en .ASP se asignan a ASP.DLL, por ejemplo. En IIS 6.0, tenía que escribir una extensión ISAPI para controlar las solicitudes con cierta extensión de archivo. ASP.NET también permitía controlar las extensiones de archivo, pero solo si asignaba la solicitud a ASP.NET primero. En IIS, puede controlar extensiones de archivo arbitrarias sin implicar ASP.NET. En nuestro ejemplo, se controlan las solicitudes con la extensión .JPG. Aquí se muestra cómo hacerlo:

Creación del directorio de contenido

Cree un directorio de contenido, por ejemplo, c:\inetpub\mypictures, y copie algunas imágenes digitales de su elección en él. Asegúrese de que estos archivos son archivos de imagen con la extensión .JPG.

Nota:

Para simplificar, los ejemplos de código que se muestran aquí no incluyen código de control de errores para los archivos que no son archivos de imagen.

Cree un subdirectorio denominado App_Code debajo del nuevo directorio: por ejemplo, c:\inetpub\mypictures\App\_Code.

Creación de la aplicación mypictures

Puede crear una aplicación que apunte a c:\inetpub\mypictures a través de la consola de administración de IIS, pero hay maneras más interesantes de hacerlo. Cree una aplicación a través de appcmd. El siguiente comando crea una aplicación denominada "mypictures" en el "Sitio web predeterminado" con la ruta de acceso física c:\inetpub\mypictures:

%windir%\system32\inetsrv\appcmd add app -site.name:"Default Web Site"

-path:/mypictures -physicalPath:%systemdrive%\inetpub\mypictures

Dado que queremos ver los archivos JPG copiados en este directorio, habilite la exploración de directorios. Haga esto a través de la consola de administración de IIS o recurra a un método más interesante y use appcmd. Aquí se muestra cómo establecer la exploración de directorios en true a través de appcmd:

%windir%\system32\inetsrv\appcmd set config "Default Web Site/mypictures"

 -section:directoryBrowse -enabled:true

Si solicita http://localhost/mypictures, verá una lista de directorios con las imágenes.

Hora de escribir código

Ahora escriba el código real de control de imágenes. Escriba algunas líneas de código de C# y tendrá el resultado: use el siguiente código como referencia y guárdelo como imagecopyrighthandler.cs en el directorio App_Code, por ejemplo c:\inetpub\mypictures\App\_Code\imagecopyrighthandler.cs.

#region Using directives
using System;
using System.Web;
using System.Drawing;
using System.Drawing.Imaging;
using Microsoft.Web.Administration;
#endregion
  
namespace IIS7Demos
{
    public class imageCopyrightHandler : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            ConfigurationSection imageCopyrightHandlerSection = 
                WebConfigurationManager.GetSection("system.webServer/imageCopyright");
  
            HandleImage(    context,
                            (bool)imageCopyrightHandlerSection.Attributes["enabled"].Value,
                            (string)imageCopyrightHandlerSection.Attributes["message"].Value,
                            (string)imageCopyrightHandlerSection.Attributes["color"].Value                            
                        );
        }
  
        void HandleImage(   HttpContext context,
                            bool enabled,
                            string copyrightText,
                            string color
                        )           
        {
            try
            {
                string strPath = context.Request.PhysicalPath;
                if (enabled)
                {
                    Bitmap bitmap = new Bitmap(strPath);
                    // add copyright message
                    Graphics g = Graphics.FromImage(bitmap);
                    Font f = new Font("Arial", 50, GraphicsUnit.Pixel);
                    SolidBrush sb = new SolidBrush(Color.FromName(color));
                    g.DrawString(   copyrightText,
                                    f,
                                    sb,
                                    5,
                                    bitmap.Height - f.Height - 5
                                );
                    f.Dispose();
                    g.Dispose();
                    // slow, but good looking resize for large images
                    context.Response.ContentType = "image/jpeg";
                    bitmap.Save(
                                        context.Response.OutputStream,
                                        System.Drawing.Imaging.ImageFormat.Jpeg
                                     );
                    bitmap.Dispose();
                }
                else
                {
                    context.Response.WriteFile(strPath);
                }
            }
            catch (Exception e)
            {
                context.Response.Write(e.Message);
            }
        }
  
        public bool IsReusable
        {
            get { return true; }
        }
    }
}

El código anterior hace lo siguiente:

  • Lee la configuración
  • Llama a HandleImage

HandleImage hace lo siguiente:

  • Crea un objeto Graphics a partir del mapa de bits
  • Crea un objeto de fuente con los valores configurados
  • Dibuja el mensaje en el mapa de bits

Para usar la clase Microsoft.Web.Administration, debe agregar la referencia al ensamblado de la API de administración de IIS. Para ello, abra %systemdrive%\inetpub\mypictures\web.config y agregue las siguientes entradas:

<system.web>
    <compilation>
      <assemblies>
        <add assembly="Microsoft.Web.Administration, Version=7.0.0.0, 
Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"/>
      </assemblies>
    </compilation>
</system.web>

También puede compilar el controlador en un ensamblado y colocarlo en mypictures/bin. Si lo hace, no tiene que agregar el ensamblado Microsoft.Web.Administration al archivo web.config.

Configuración del controlador

Solo tiene que indicar a IIS que invoque el nuevo controlador si se solicita un archivo .JPG. Haga esto a través de la consola de administración de IIS o use appcmd:

appcmd set config "Default Web Site/mypictures/" -section:handlers 

/+[name='JPG-imageCopyrightHandler',path='*.jpg',verb='GET',type='IIS7Demos.imageCopyrightHandler']

El comando appcmd anterior configura el nuevo controlador solo en el directorio /mypictures. Dado que las entradas del controlador están en una colección, debe usar la sintaxis +[]. Esta sintaxis se utiliza siempre que hay que agregar elementos a colecciones. Los elementos de la configuración del controlador son:

name

Puede ser cualquier nombre único. El nombre solo se usa para identificar de forma única el controlador.

path

Indica a IIS cuándo ejecutar este controlador. *.JPG indica a IIS que ejecute este controlador para todos los archivos que terminan en .JPG. Si usa foo*.JPG como ruta de acceso, este controlador ejecuta solo los archivos JPG a partir de foo.

verbo

Lista separada por comas de los verbos http que deben coincidir para ejecutar este controlador. En nuestro caso, solo queremos ejecutar la solicitud cuando entra una solicitud GET.

type

Tipo administrado de la clase que se debe ejecutar cuando la solicitud coincide. Se compone del espacio de nombres y de la clase derivada IHttpHandler del directorio App_Code.

Un último apunte

Antes de empezar a probar las imágenes con copyright, asegúrese de que el proceso de trabajo de IIS que ejecuta la solicitud recoge los cambios de esquema realizados. Es posible que el proceso de trabajo ya se estuviera ejecutando cuando agregó el archivo imageCopyright.xml al directorio de esquema. Si esto sucede, obtendrá una excepción de configuración en imagecopyrightconfig.cs. El autor se encontró con este problema al escribir este artículo y le costó bastante tiempo.

Simplemente reciclar el grupo de aplicaciones resuelve este problema:

appcmd recycle AppPool DefaultAppPool

El proceso se ha completado. Si ahora solicita http://localhost/mypictures/<imageOfYourChoice>.jpg), verá el mensaje de copyright.

Opciones:

  • Puede cambiar las opciones del mensaje de copyright a través de appcmd o editando directamente el archivo web.config
  • Puede asignar el controlador imageCopyright a otros tipos de imagen, por ejemplo BMP o GIF, añadiendo el mismo controlador para una extensión diferente. Ejemplo:
appcmd set config "Default Web Site/mypictures/" -section:handlers /+[name='BMP-imageCopyrightHandler',path='*.bmp',verb='GET',type='IIS7Demos.imageCopyrightHandler']

Últimos retoques. Ya hemos ampliado el núcleo del servidor IIS con unas pocas líneas de código; hemos ampliado el sistema de configuración de IIS sin código alguno y hemos obtenido soporte gratuito para la línea de comandos. Ahora, vamos a configurar nuestro controlador imageCopyright a través de la consola de administración de IIS.

Lo haremos a través de las siguientes tareas:

  • Creación del proyecto en Microsoft Visual Studio o Microsoft Visual C# Express para que el ensamblado se pueda usar dentro de la consola de administración de IIS
  • Creación de un proveedor de módulos
  • Creación de un módulo que lee y establece las propiedades imageCopyright.

Crear el proyecto

Para crear un módulo de extensibilidad para InetMgr, debe crear un proyecto DLL, también conocido como proyecto de biblioteca de clases. Este archivo DLL debe tener un nombre seguro para que se pueda registrar en la GAC (caché global de ensamblados), que es un requisito para los módulos que usa la consola de administración de IIS.

Pasos

  1. Haga clic en Inicio, haga clic en Programas y ejecute Microsoft Visual Studio 2005 o Microsoft Visual C# 2005 Express Edition.

  2. En el menú Archivo, seleccione la opción Nuevo proyecto.

  3. En el cuadro de diálogo Nuevo proyecto, seleccione Biblioteca de clases como tipo de proyecto y escriba imageCopyrightUI como nombre del proyecto y haga clic en Aceptar.

    Screenshot of New Project dialog box with Class Library selected and image Copyright U I entered in the Name filed as the name of the project.
    Figura 2: cuadro de diálogo Nuevo proyecto

  4. Quite el archivo Class1.cs que se agregó de forma predeterminada, ya que no se va a usar.

  5. Con la opción Agregar nueva referencia del menú Proyecto, agregue una referencia a Microsoft.Web.Management.dll ubicada en el directorio \Windows\system32\inetsrv. Este es el archivo DLL que contiene todas las clases de extensibilidad necesarias para crear módulos para la consola de administración de IIS.

  6. Con la opción Agregar nueva referencia desde el menú Proyecto, agregue una referencia a Microsoft.Web.Administration.dll, ubicada en el directorio \Windows\system32\inetsrv. Este es el archivo DLL que contiene todas las clases de configuración necesarias para leer la configuración de escritura de la configuración de IIS.

  7. Dado que usaremos código para crear la interfaz de usuario basada en WinForms, también queremos agregar una referencia a System.Windows.Forms.dll; para ello de nuevo con la opción Agregar nueva referencia en el menú Proyecto, seleccione System.Windows.Forms.dll y System.Web.dll en la lista de ensamblados .NET.

  8. Uno de los requisitos para que las bibliotecas se usen en InetMgr es que deben registrarse dentro de la GAC. Para ello, es necesario asegurarnos de que nuestro archivo DLL tiene un nombre seguro (a veces denominado Firmado). Visual Studio ofrece una manera fácil de crear nuevos nombres y seleccionar uno para el proyecto, así que para eso, usando el menú Proyecto, seleccione la opción Propiedades de imageCopyrightUI.

  9. En la pestaña Firma, active la casilla Firmar el ensamblado.

  10. En la casilla Crear clave de nombre seguro, escriba imageCopyrightUI como nombre para la clave y desactive la casilla Proteger mi archivo de clave con contraseña. Haga clic en OK.

    Screenshot of Create Strong Name Key dialog box displaying image Copyright U I entered as Key file name and password created and confirmed.
    Figura 3: cuadro de diálogo Crear nombre seguro

    La pestaña de firma muestra:

    Screenshot of Signing tab with image Copyright U I dot s n k selected in the Choose a strong name key file field.
    Figura 4: pestaña Firma de proyectos de VS

  11. Dado que queremos que el ensamblado esté en la GAC, agregaremos algunos eventos posteriores a la compilación para que se agregue automáticamente a la GAC cada vez que se compile. Esto hará que sea muy sencillo depurar y realizar cambios a medida que agregamos nueva funcionalidad. Para ello, seleccione la pestaña Eventos de compilación y agregue la siguiente línea de comandos del evento posterior a la compilación:

    call "%VS80COMNTOOLS%\vsvars32.bat" > NULL
    
    gacutil.exe /if "$(TargetPath)"
    

    Screenshot of Post Build Event command line populated with code.
    Figura 5: pestaña Eventos posteriores a la compilación de VS

    (Opcional) Si usa Microsoft Visual Studio 2005 (esto no funcionará con Visual C# Express Edition), configure la depuración correctamente para usar F5 para ejecutar el código. Para ello, vaya a las propiedades del proyecto, seleccione la pestaña Depurar y establézcalo para iniciar un programa externo seleccionando \windows\system32\inetsrv\inetmgr.exe

    Screenshot of Debug tab set to Start external program action.
    Figura 6: pestaña Depuración

  12. Por último, cierre las propiedades del proyecto, seleccione la opción Guardar todo en el menú Archivo y haga clic en Aceptar.

    Ahora compile el proyecto mediante Compilar solución en el menú Compilar. Esto compila automáticamente el archivo DLL y lo agrega a la GAC.

Creación del proveedor de módulos

La interfaz de usuario de IIS es tan personalizable y modular como el servidor principal de IIS y el sistema de configuración de IIS. La interfaz de usuario de IIS es un conjunto de módulos de características que se pueden quitar o reemplazar. El punto de entrada de cada módulo de interfaz de usuario es un proveedor de módulos. Puede encontrar una lista de todos los proveedores de módulos en %windir%\system32\inetsrv\Administration.config en la sección <modules>.

Como primer paso, cree el proveedor del módulo imageCopyrightUI.

Pasos

  1. Seleccione la opción Agregar nuevo elemento en el menú Proyecto. En el cuadro de diálogo Agregar nuevo elemento, seleccione la plantilla Clase y escriba imageCopyrightUIModuleProvider.cs como nombre del archivo.

    Screenshot of Add New Item dialog box with Class template selected and the Name field populated with image Copyright U I Module Provider dot c s.
    Figura 7: cuadro de diálogo Agregar nuevo elemento

  2. Cambie el código para que tenga el siguiente aspecto:

    using System;
    using System.Security;
    using Microsoft.Web.Management.Server;
        
    namespace IIS7Demos           
    {
        class imageCopyrightUIProvider : ModuleProvider
        {
            public override Type ServiceType              
            {
                get { return null; }
            }
    
            public override ModuleDefinition GetModuleDefinition(IManagementContext context)
            {
                return new ModuleDefinition(Name, typeof(imageCopyrightUI).AssemblyQualifiedName);
            }
    
            public override bool SupportsScope(ManagementScope scope)
            {
                return true;
            }
        }            
    }
    

    Este código crea un ModuleProvider que admite todos los tipos de ámbitos (servidor, sitio y aplicación) y registra un módulo del lado cliente denominado imageCopyrightUI. Para mostrar solo el módulo en el nivel de aplicación, la función SupportsScope tiene este aspecto:

    public override bool SupportsScope(ManagementScope scope)
    {
        return (scope == ManagementScope.Application) ;
    }
    

Creación del módulo de interfaz de usuario

Un módulo es el punto de entrada principal del cliente para todos los objetos de extensibilidad. Tiene un método principal denominado Inicializar. Este es el método donde se realiza toda la acción.

Pasos

  1. Seleccione la opción Agregar nuevo elemento en el menú Proyecto.

  2. Seleccione la plantilla Clase y escriba imageCopyrightUI.cs como nombre de archivo. Cambie el código para que tenga el siguiente aspecto:

    using System;
    using System.Windows.Forms;
    using Microsoft.Web.Management.Client;
    using Microsoft.Web.Management.Server;
    
    namespace IIS7Demos
    {
        internal class imageCopyrightUI : Module
        {
            protected override void Initialize(IServiceProvider serviceProvider, ModuleInfo moduleInfo)
            {
                base.Initialize(serviceProvider, moduleInfo);
                IControlPanel controlPanel = (IControlPanel)GetService(typeof(IControlPanel));
                ModulePageInfo modulePageInfo = new ModulePageInfo(this, typeof(imageCopyrightUIPage), "Image Copyright", "Image Copyright");
                controlPanel.RegisterPage(modulePageInfo);
            }
        }              
    }
    

    En el código anterior, especificamos el texto de la entrada en la lista de módulos de interfaz de usuario y el tipo de una sola página que se debe mostrar cuando un usuario hace clic en este texto.

Sólo queda escribir la página propiamente dicha.

Creación de la página de módulo

En esta tarea, creará la página de módulo más básica. ModulePage es la clase base proporcionada por el marco para crear una nueva interfaz de usuario. Hay cuatro clases diferentes que son proporcionados por el marco que son útiles, dependiendo del escenario que está tratando de construir.

  • ModulePage. Esta clase base solo ofrece los servicios más básicos y no ofrece ninguna interfaz de usuario especial. Ninguna de las características que se incluyen en InetMgr deriva directamente de esta clase.
  • ModuleDialogPage. Esta clase base ofrece una semántica similar a la de un cuadro de diálogo, incluyendo los vínculos Aplicar y Cancelar en la lista de tareas y ofrece métodos específicos que se pueden sobrescribir para manejar estas tareas comunes. También controla cosas como Actualizar y otras funciones automáticamente. Algunos ejemplos de funciones que se derivan de esta página son Clave de máquina, Servicio de gestión, etc.
  • ModulePropertiesPage. Esta clase base ofrece una interfaz de usuario similar a la cuadrícula de propiedades de Visual Studio, donde todas las propiedades se muestran en un control jerárquico similar a una cuadrícula. Entre los ejemplos de esto se incluyen CGI, ASP, compilación de .NET, etc.
  • ModuleListPage. Esta clase base es útil siempre que necesite mostrar una lista de elementos. Incluye un control ListView que puede usar para mostrar la configuración y las ofertas de búsqueda, agrupación y vistas automáticamente. Entre los ejemplos se incluyen la configuración de la aplicación, los módulos, los procesos de trabajo, etc.

Pasos

  1. Seleccione la opción Agregar nuevo elemento en el menú Proyecto.

  2. En el cuadro de diálogo Agregar nuevo elemento, seleccione la plantilla Clase y escriba imageCopyrightUIPage.cs como nombre del archivo. Cambie el código para que tenga el siguiente aspecto:

    using System;
    using System.Collections.Generic;
    using System.Windows.Forms;
    using Microsoft.Web.Management.Client.Win32;
    using Microsoft.Web.Administration;
    using Microsoft.Web.Management.Client;
    using Microsoft.Web.Management.Server;
    namespace IIS7Demos
    {
        public sealed class imageCopyrightUIPage : ModulePage
        {
            public string message;
            public bool featureenabled;
            public string color;
    
            ComboBox _colCombo = new ComboBox();
            TextBox _msgTB = new TextBox();
            CheckBox _enabledCB = new CheckBox();
            public imageCopyrightUIPage()
            {
                this.Initialize();
            }
            protected override void OnActivated(bool initialActivation)
            {
               base.OnActivated(initialActivation);
               if (initialActivation)
               {
                    ReadConfig();
                    UpdateUI();
                }
            }
    
            void UpdateUI()
            {
                _enabledCB.Checked = featureenabled;
                int n = _colCombo.FindString(color, 0);
                _colCombo.SelectedIndex = n;
                _msgTB.Text = message;
            }
    
            void Initialize()
            {
                Label crlabel = new Label();
                crlabel.Left = 50;
                crlabel.Top = 100;
                crlabel.AutoSize = true;
                crlabel.Text = "Enable Image Copyright:";
                _enabledCB.Text = "";
                _enabledCB.Left = 200;
                _enabledCB.Top = 100;
                _enabledCB.AutoSize = true;
    
                Label msglabel = new Label();
                msglabel.Left = 150;
                msglabel.Top = 130;
                msglabel.AutoSize = true;
                msglabel.Text = "Message:";
                _msgTB.Left = 200;
                _msgTB.Top = 130;
                _msgTB.Width = 200;
                _msgTB.Height = 50;
    
                Label collabel = new Label();
                collabel.Left = 160;
                collabel.Top = 160;
                collabel.AutoSize = true;
                collabel.Text = "Color:";
                _colCombo.Left = 200;
                _colCombo.Top = 160;
                _colCombo.Width = 50;
                _colCombo.Height = 90;
                _colCombo.Items.Add((object)"Yellow");
                _colCombo.Items.Add((object)"Blue");
                _colCombo.Items.Add((object)"Red");
                _colCombo.Items.Add((object)"White");
    
                Button apply = new Button();
                apply.Text = "Apply";
                apply.Click += new EventHandler(this.applyClick);
                apply.Left = 200;
                apply.AutoSize = true;
                apply.Top = 250;
    
                Controls.Add(crlabel);
                Controls.Add(_enabledCB);
                Controls.Add(collabel);
                Controls.Add(_colCombo);
                Controls.Add(msglabel);
                Controls.Add(_msgTB);
                Controls.Add(apply);
            }
    
            private void applyClick(Object sender, EventArgs e)
            {
                try
                {
                    UpdateVariables();
                    ServerManager mgr;
                    ConfigurationSection section;
                    mgr = new ServerManager();
                    Configuration config =
                    mgr.GetWebConfiguration
                    (
                           Connection.ConfigurationPath.SiteName, 
                           Connection.ConfigurationPath.ApplicationPath +
                           Connection.ConfigurationPath.FolderPath
                    );
    
                section = config.GetSection("system.webServer/imageCopyright");
                section.GetAttribute("color").Value = (object)color;
                section.GetAttribute("message").Value = (object)message;
                section.GetAttribute("enabled").Value = (object)featureenabled;
    
                mgr.CommitChanges();
    
                }
    
                catch
                {}
    
            }
    
            public void UpdateVariables()
            {
                featureenabled = _enabledCB.Checked;
                color = _colCombo.Text;
                message = _msgTB.Text;
            }
    
            public void ReadConfig()
            {
                try
                {
                    ServerManager mgr;
                    ConfigurationSection section;
                    mgr = new ServerManager();
                    Configuration config =
                    mgr.GetWebConfiguration(
                           Connection.ConfigurationPath.SiteName,
                           Connection.ConfigurationPath.ApplicationPath +
                           Connection.ConfigurationPath.FolderPath);
    
                    section = config.GetSection("system.webServer/imageCopyright");
                    color = (string)section.GetAttribute("color").Value;
                    message = (string)section.GetAttribute("message").Value;
                    featureenabled = (bool)section.GetAttribute("enabled").Value;
    
                }
    
                catch
                {}
    
            }
        }
    }
    

    Aunque hay mucho, este código no hace nada más que colocar un par de controles en ModulePage y lee y escribe en el almacén de configuración de IIS.

Configuración de lectura

La función ReadConfig usa las mismas interfaces de Microsoft.Web.Administration para abrir el almacén de configuración de IIS. La propia interfaz de usuario proporciona el ámbito en el que se aplicarán las opciones de configuración.

Ejemplo:

Connection.ConfigurationPath.SiteName,

Connection.ConfigurationPath.ApplicationPath+

Connection.ConfigurationPath.FolderPath

Guardado de la configuración

La configuración se guarda cuando se hace clic en el botón Aplicar (función applyClick). Los cambios realizados en la transferencia de la interfaz de usuario a los atributos de sección y la sección se guarda en el disco.

section.GetAttribute("enabled").Value = (object)featureenabled;

mgr.CommitChanges();

En este punto, está listo para compilar todo de nuevo con "Compilar solución" desde el menú Compilar. Esto compila el ensamblado imageCopyrightUI y lo coloca en la caché global de ensamblados.

Registro de módulos

El módulo de interfaz de usuario se compila, pero todavía debemos indicarle a IIS Management Console que lo cargue. Para ello, haga lo siguiente:

  • Obtención del nombre seguro del módulo de interfaz de usuario de la caché global de ensamblados
  • Añadir el nombre seguro y el tipo al archivo de configuración de la consola de administración de IIS. Esto hará que la consola de administración de IIS cargue el tipo al iniciarse
  • Habilitación del módulo en la lista de módulos de interfaz de usuario

Pasos

  1. Abra o use un shell de comandos con privilegios elevados existente y registre las variables de entorno de Visual Studio 8.0 ejecutando el siguiente comando:

    "%vs80comntools%\vsvars32.bat
    
  2. Ejecución de GacUtil

    GACUTIL /l imageCopyrightUI
    
  3. Abra %windir%\system32\inetsrv\config\administration.config y agregue lo siguiente justo después de la entrada <moduleProviders>:

    <add name="imageCopyrightUI" type="IIS7Demos.imageCopyrightUIProvider, IIS7Demos, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3fd9bd5e992ee757"/>
    

El resultado

Ha completado la tarea. Mire los resultados.

Abra la consola de administración de IIS y vaya a la aplicación /mypictures.

Haga doble clic en la entrada "Copyright de imagen".

Screenshot of I I S Management Console with my pictures application selected and image Copyright message displayed.
Figura 8: interfaz de usuario de copyright de imagen

Cambie el mensaje de copyright, haga clic en Aplicar y actualice el explorador. El mensaje de copyright ha cambiado. Examine el archivo web.config en el directorio %systemdrive%\inetpub\mypictures para ver la configuración modificada.

Resumen

IIS es extensible en formas que antes no eran posibles. Puede ampliar la canalización de procesamiento principal de IIS con su propio componente, almacenar la configuración de este componente junto con la configuración de IIS e incluso escribir un complemento de interfaz de usuario que se conviva con la configuración estándar de IIS. Para revisar lo que hicimos en el ejemplo anterior:

Extensibilidad principal de IIS

Hemos agregado un controlador de imágenes al núcleo de IIS que inserta un mensaje de copyright en cada archivo .JPG que se sirve. Esto se realizó con solo unas pocas líneas de código de C#. La funcionalidad del controlador estaba controlada por la configuración. Almacenamos la configuración en los archivos de configuración normales de IIS applicationhost.config y web.config. También se ha agregado compatibilidad con el almacenamiento en caché para las imágenes.

Extensibilidad del sistema de configuración de IIS

Hemos agregado la configuración del controlador de derechos de autor de la imagen al sistema de configuración de IIS. Ventajas como un almacén xml de gran legibilidad, la API instantánea y la compatibilidad con la línea de comandos, la delegación y las implementaciones distribuidas son gratuitas. No tuvimos que escribir ni una sola línea de código.

Extensibilidad de la interfaz de usuario de IIS

Para proporcionar a nuestra característica la visibilidad que merece, agregamos un módulo de interfaz de usuario de IIS. Aunque no se muestra, la interfaz de usuario de IIS es completamente remota a través de HTTPS.