Cómo agregar seguimiento a módulos administrados de IIS 7.0

por Saad Ladki

Introducción

IIS 7.0 y versiones posteriores cuentan con la capacidad de conectar y usar módulos administrados desarrollados personalizados para realizar muchas tareas diferentes y usar esos módulos para todo tipo de contenido. Sin embargo, surge la pregunta: ¿qué ocurre si el módulo tiene problemas o dificultades? Anteriormente, usó System.Diagnostics para realizar un seguimiento del evento cuando se produjeron problemas. Por desgracia, esos seguimientos son completamente independientes de los seguimientos de IIS.

No es así con IIS 7.0 y versiones posteriores. Ahora puede agregar seguimientos al código del módulo mediante System.Diagnostics.TraceSource (nuevo en .Net 2.0). Tiene la capacidad de enrutar esos seguimientos a la infraestructura de seguimiento de IIS para que estén disponibles para los módulos que consumen seguimientos, por ejemplo, el seguimiento de solicitudes erróneas.

El equipo de IIS fomenta la instrumentación de código mediante patrones básicos, como:

  • Eventos START y STOP en torno a actividades clave dentro del código
  • Eventos WARNING y ERROR para repeticiones inesperadas que podrían hacer que se produzca un error en la solicitud (como la autenticación con errores)
  • Eventos INFORMATIONAL y VERBOSE para obtener ayuda con diagnósticos, como la configuración del módulo que se usa

Las tareas ilustradas en este tutorial incluyen:

  • Adición de seguimiento al módulo mediante System.Diagnostics.TraceSource
  • Configuración del seguimiento de solicitudes erróneas para capturar estos seguimientos
  • Generación de la condición de error y visualización del seguimiento resultante

Requisitos previos

Siga los siguientes pasos antes de realizar las tareas de este artículo.

Paso 1: instalación de IIS

En primer lugar, se debe instalar IIS. Compruebe si IIS está instalado; para ello, vaya a http://localhost/. Si IIS está instalado, verá la página "en construcción". Si IIS no está instalado, consulte Instalación de IIS para obtener instrucciones. Asegúrese de instalar los siguientes componentes de IIS:

  • ASP (en World Wide Web Services => Características de desarrollo de aplicaciones => ASP)
  • ASP.Net (en World Wide Web Services => Características de desarrollo de aplicaciones => ASP.Net)
  • Seguimiento (en World Wide Web Services => Mantenimiento y diagnósticos => Seguimiento)

Paso 2: iniciar sesión como administrador

Inicie sesión tal como es la cuenta de administrador o en el grupo Administradores.

Nota:

Estar en el grupo Administradores no le concede privilegios de administrador completos de forma predeterminada. Debe ejecutar muchas aplicaciones como administrador. Haga clic con el botón derecho en el icono de la aplicación y elija "Ejecutar como administrador".

Paso 3: realización de una copia de seguridad

Realice una copia de seguridad de la configuración antes de ejecutar las tareas de este artículo. Ejecute lo siguiente:

  1. Haga clic en el botón Inicio -> Todos los programas -> Accesorios -> (clic derecho)Símbolo del sistema -> Ejecutar como administrador
    Screenshot of the Windows Start menu with a focus on the Run as administrator option in the right-click drop-down menu.

  2. Ejecute el siguiente comando en ese símbolo del sistema:

    %windir%\system32\inetsrv\appcmd add backup
    

Paso 4: creación de contenido de ejemplo

  1. Elimine todo lo que hay en la carpeta c:\inetpub\wwwroot.
  2. En el símbolo del sistema de administrador iniciado anteriormente, pegue el código adjunto en un archivo inetpub\wwwroot llamado test.htm:
<h2>HOWTO: Adding tracing to modules </h2>
This is a sample page served by the static file handler (native code).

Creación y seguimiento de un módulo simple

En esta sección, creará un módulo de ejemplo para instrumentar.

Paso 1: creación de un módulo simple

Con el símbolo del sistema administrador, copie y pegue el siguiente código en un archivo denominado IIS_MOD_REQDATA.cs:

using System;
using System.Collections.Generic;
using System.Text;
using System.Web;

namespace IIS_MOD_REQDATA
{
    public class IIS_MOD_REQDATA : IHttpModule
    {
        public void Init(HttpApplication application)
        {
            application.EndRequest += (new EventHandler(this.Application_EndRequest));
        }

        private void Application_EndRequest(Object source, EventArgs e)
        {
            HttpApplication application = (HttpApplication)source;
            HttpContext context = application.Context;

            // start writing out the request data

            context.Response.Write("<hr>");
            context.Response.Write("<b><font size=2 color=green>REQUEST HEADERS</font></b><br>");
            context.Response.Write("<font size=2>");
            context.Response.Write("METHOD : " + context.Request.HttpMethod + "<br>");
            context.Response.Write("URL : " + context.Request.Url + "<br>");
            context.Response.Write("QUERYSTRING : " + context.Request.QueryString + "<br>");
            context.Response.Write("</font><br>");

            // now response data

            context.Response.Write("<b><font size=2 color=blue>RESPONSE HEADERS</font></b><br>");
            context.Response.Write("<font size=2>");
            context.Response.Write("STATUS CODE : " + context.Response.StatusCode.ToString() + "." + context.Response.SubStatusCode.ToString() + "<br>");
            context.Response.Write("CONTENT TYPE : " + context.Response.ContentType.ToString() + "<br>");
            context.Response.Write("EXPIRES : " + context.Response.Expires.ToString() + "<br>");
            context.Response.Write("</font><br>");

            // set cache policy on response so it's not cached.

            context.Response.DisableKernelCache();
        }

        public void Dispose()
        {
        }
    }
}

Paso 2: adición de seguimiento al módulo administrado

Para agregar seguimiento al módulo y enrutar sus eventos de seguimiento a IIS, use el origen System.Diagnostics.Trace. Agregue la siguiente línea bajo las instrucciones de uso:

using System.Diagnostics;

Debe crear un elemento TraceSource en el código: observe la definición de traceSource dentro de la declaración del módulo IIS_MOD_REQDATA:

public class IIS_MOD_REQDATA : IHttpModule
{
    TraceSource tsStatus;

El miembro tsStatus se inicializa durante el método Init() de IHttpModule:

public void Init(HttpApplication application)    
{    
    application.EndRequest += (new EventHandler(this.Application_EndRequest));
    // setup traceSource
    tsStatus = new TraceSource("tsStatus");    
}

El nombre de TraceSource ("tsStatus") es importante, ya que este se hará referencia a este nombre más adelante en el archivo web.config. El módulo ahora está configurado para emitir eventos si es necesario.

Para agregar un nuevo evento de seguimiento, use tsStatus.TraceEvent(<tipo>, 0, <somestring>) para escribir eventos. Agregue los eventos Start y End recomendados al método Application_EndRequest():

private void Application_EndRequest(Object source, EventArgs e)        
{    
    tsStatus.TraceEvent(TraceEventType.Start, 0, "[REQDATA MODULE] START EndRequest");

    // other code

    tsStatus.TraceEvent(TraceEventType.Stop, 0, "[REQDATA MODULE] END EndRequest");    
}

Observe los distintos <tipos>; los tipos admitidos, entre otros, incluyen:

  • TraceEventType.Start
  • TraceEventType.Stop
  • TraceEventType.Error
  • TraceEventType.Warning
  • TraceEventType.Information
  • TraceEventType.Verbose

Por integridad, todo el origen del módulo (incluidos los eventos de seguimiento), se puede copiar desde aquí:

using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Diagnostics;

namespace IIS_MOD_REQDATA
{
    public class IIS_MOD_REQDATA : IHttpModule
    {

        TraceSource tsStatus;

        public void Init(HttpApplication application)
        {
            application.EndRequest += (new EventHandler(this.Application_EndRequest));

            // TRACING

            tsStatus = new TraceSource("tsStatus");
        }

        private void Application_EndRequest(Object source, EventArgs e)
        {
            HttpApplication application = (HttpApplication)source;
            HttpContext context = application.Context;

            tsStatus.TraceEvent(TraceEventType.Start, 0, "[REQDATA MODULE] START EndRequest");

            // start writing out the request data

            context.Response.Write("<hr>");
            context.Response.Write("<b><font size=2 color=green>REQUEST HEADERS</font></b><br>");
            context.Response.Write("<font size=2>");
            context.Response.Write("METHOD : " + context.Request.HttpMethod + "<br>");
            context.Response.Write("URL : " + context.Request.Url + "<br>");
            context.Response.Write("QUERYSTRING : " + context.Request.QueryString + "<br>");
            context.Response.Write("</font><br>");

            tsStatus.TraceEvent(TraceEventType.Verbose, 0, "[REQDATA MODULE] done with Req Data, moving onto Response");

            // now response data

            context.Response.Write("<b><font size=2 color=blue>RESPONSE HEADERS</font></b><br>");
            context.Response.Write("<font size=2>");
            context.Response.Write("STATUS CODE : " + context.Response.StatusCode.ToString() + "." + context.Response.SubStatusCode.ToString() + "<br>");
            context.Response.Write("CONTENT TYPE : " + context.Response.ContentType.ToString() + "<br>");
            context.Response.Write("EXPIRES : " + context.Response.Expires.ToString() + "<br>");
            context.Response.Write("</font><br>");

            if (context.Response.StatusCode > 399)
            {
                tsStatus.TraceEvent(TraceEventType.Warning, 0, "[REQDATA MODULE] error status code detected");
            }

            tsStatus.TraceEvent(TraceEventType.Verbose, 0, "[REQDATA MODULE] done with Response Data");

            // set cache policy on response so it's not cached.

            context.Response.DisableKernelCache();
            tsStatus.TraceEvent(TraceEventType.Verbose, 0, "[REQDATA MODULE] cache setting is (" + context.Response.Cache.ToString() + ")");

            tsStatus.TraceEvent(TraceEventType.Stop, 0, "[REQDATA MODULE] STOP - EndRequest");
        }

        public void Dispose()
        {
        }
    }
}

Paso 3: compilación de nuestro módulo de seguimiento

Ahora para compilar el módulo e implementarlo. En el símbolo del sistema administrador, ejecute el siguiente comando:

%systemroot%\Microsoft.NET\Framework\v2.0.50727\csc.exe /target:library /out:IIS_MOD_REQDATA.dll /debug /d:TRACE /R:System.Web.dll IIS_MOD_REQDATA.cs

Screenshot of the exclamation code dash consoleMain command in Notepad.

Nota:

Si ejecuta esto en un sistema de 64 bits, compile con el compilador de c# de 64 bits en %windir%\microsoft.net\framework64\v2.0.50727\csc.exe

Tenga en cuenta el uso de los modificadores /debug y /d:TRACE. Debe usar estos modificadores para compilar los eventos de seguimiento en el binario. Si no se compila con estos modificadores, el módulo no tendrá ningún evento de seguimiento en él.

Después de compilar el módulo, impleméntelo y ejecute una prueba inicial para ver si funciona antes de capturar sus seguimientos.

Adición de módulos a la configuración del sitio

En esta sección se incluye la adición y la prueba del módulo.

Paso 1: adición del módulo a la configuración del sitio

  1. Con el mismo símbolo del sistema administrador, realice un directorio denominado \inetpub\wwwroot\bin y, a continuación, copie IIS_MOD_REQDATA.dll en ese directorio.
  2. Habilite el módulo. En el símbolo del sistema del administrador, escriba iniciar inetmgr para abrir la interfaz de usuario de administración de IIS.
  3. En el panel Conexiones, expanda el nombre del equipo local y, a continuación, Sitios, y haga clic en Sitio web predeterminado.
  4. En IIS en el panel central, haga doble clic en Módulos:
    Screenshot of the Default Web Site Home screen with the Modules option being highlighted.
  5. Verá una lista grande de módulos configurados para su uso por parte de este sitio. En el lado derecho de la interfaz de usuario en Acciones, haga clic en Agregar módulo administrado:
    Screenshot of the Actions pane with a focus on the Add Managed Module option.
  6. En la ventana que se muestra, asigne al módulo administrado el nombre IIS_MOD_REQDATA y el tipo del módulo es IIS_MOD_REQDATA.IIS_MOD_REQDATA(selecciónelo en el cuadro de lista desplegable):
    Screenshot of the Add Managed Module dialog box, showing the Name and Type fields.
  7. Haga clic en OK. El módulo recién rastreado ahora está configurado para el uso del sitio web.
    Screenshot of the Modules screen, showing the newly traced module.

Paso 2: prueba del módulo

Para probar el módulo, abra Internet Explorer y vaya a http://localhost/test.htm. Verá la siguiente ventana:

Screenshot of a webpage reading here is a sample page that is served by static file handler.

El contenido "ENCABEZADOS DE SOLICITUD" y "ENCABEZADOS DE RESPUESTA" procede de nuestro módulo, lo que indica que funciona.

Enrutamiento de eventos a IIS

Esta tarea enlaza el TraceSource del módulo a un seguimiento de IIS para que sus eventos se emitan a través de IIS y, a continuación, configure seguimiento de solicitudes erróneas para capturar estos eventos de seguimiento.

Paso 1: habilitación del módulo TraceSource y enrutar sus eventos a IIS

El módulo se actualiza para incluir eventos de seguimiento. Configure System.Diagnostics e IIS para capturar estos eventos de seguimiento y enrutarlos al módulo Seguimiento de solicitudes erróneas de IIS. Para ello, configure la sección <system.diagnostics> en el archivo web.config para configurar TraceSource y enrutar sus eventos en consecuencia.

  1. Con el símbolo del sistema administrador, vaya a c:\inetpub\wwwroot y use el Bloc de notas para editar el archivo web.config.

  2. Hay tres partes de la configuración que se deben completar para obtener los eventos emitidos por el módulo para enrutarse a la infraestructura de seguimiento de IIS:

    • Definición del evento traceListener de IIS como un agente de escucha compartido
    • Definición de un modificador para habilitar todos los eventos
    • Definir el origen de seguimiento, adjuntar el modificador que definimos, así como definir el agente de escucha de seguimiento para nuestro origen.
  3. IIS incluye un nuevo System.Diagnostics.TraceListener que se usa para enrutar los eventos TraceSource a la infraestructura de seguimiento de IIS. Este proveedor también debe definirse en el archivo web.config.

  4. Defina el traceSource por su nombre (tsStatus) y conéctelo al DefaultSwitch y IisTraceListener.

  5. Copie y pegue esta sección <system.Diagnostics>en el archivo web.config (después de la sección <system.webServer>).

    <system.diagnostics>
        <sharedListeners>
          <add name="IisTraceListener" type="System.Web.IisTraceListener, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        </sharedListeners>
    
        <switches>
          <add name="DefaultSwitch" value="All" />
        </switches>
    
        <sources>
          <source name="tsStatus" switchName="DefaultSwitch">
            <listeners>
              <add name="IisTraceListener" type="System.Web.IisTraceListener, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
            </listeners>
          </source>
        </sources>
    </system.diagnostics>
    

El traceSource tsStatus se conecta a IIS7TraceListener, que emitirá eventos en la infraestructura de seguimiento de IIS. Continúe con el siguiente paso para conectar esos eventos al proveedor de seguimiento de solicitudes erróneas.

Paso 2: habilitación del seguimiento de solicitudes erróneas para capturar eventos de seguimiento de módulo

Cuando estos eventos de diagnóstico se emiten en la infraestructura de seguimiento de IIS, se asignan a la marca proveedor y módulo de ASP.net en ese proveedor. Su detalle depende del objeto TraceEventType usado. Para configurar el seguimiento de solicitudes erróneas para que lo seleccione:

  1. En el símbolo del sistema de administrador, escriba iniciar inetmgr. En el panel Conexiones, expanda el nombre de la máquina y, a continuación, la carpeta Sitios y, a continuación, haga clic en el sitio web predeterminado. A la derecha debajo del panel Acciones, haga clic en el vínculo Seguimiento de solicitudes erróneas... en Configurar:
    Screenshot of the Manage Web Site section of the Actions pane, with the Failed Request Tracing option being highlighted.

  2. En el siguiente cuadro de diálogo, configure lo siguiente:
    Screenshot of the Edit Web Site Failed Request Tracing Settings dialog box.

  3. Active la casilla Habilitar. Acepte los valores predeterminados para las demás configuraciones. Haga clic en Aceptar para continuar.

  4. Ahora que hemos comprobado que el registro de seguimiento de solicitudes erróneas está habilitado, debemos configurar las definiciones de error. De nuevo en el administrador de IIS, en IIS, haga doble clic en Reglas de seguimiento de solicitudes erróneas
    Screenshot of the Default Web Site Home screen with the Failed Request Tracing Rules option being highlighted.

  5. En el panel Acciones, haga clic en Agregar... Esto inicia el asistente Agregar regla de seguimiento de solicitudes erróneas.

  6. En la página Especificar contenido al que realiza un seguimiento, seleccione la opción Todo el contenido (*) para lo que se va a realizar un seguimiento. Haga clic en Next.
    Screenshot of the Add Failed Request Tracing Rule page with a focus on the Next option.

  7. En la pantalla Definir condiciones de seguimiento, active la casilla Códigos de estado y escriba "200" como el código de estado que se va a rastrear.
    Screenshot of the Define Trace Conditions screen with the Status codes field being checked.

  8. Haga clic en Next. Aparece la página Seleccionar proveedores de seguimiento. Active la casilla ASPNET y las casillas Módulo y página en "Áreas". En Verbosity, seleccione Verbose.
    Screenshot of the Select Trace Providers screen with the ASPNET Provider option being highlighted.

    Nota:

    Debido a un error en las compilaciones de Server Beta 3, los seguimientos del módulo solo se pueden capturar si se seleccionan las áreas Módulo y Página. Post Server Beta 3, solo se requiere Módulo para recopilar estos eventos.

  9. Haga clic en Finalizar Verá la siguiente definición para el sitio web predeterminado:
    Screenshot of the Failed Request Tracing Rules screen.

Pruebas y visualización de los resultados

En esta tarea, generamos la solicitud con error y vemos el registro de seguimiento resultante. Recuerde que hemos configurado IIS para capturar registros de seguimiento para http://localhost/* solicitudes que producen un error de 200. Para comprobar que ha funcionado:

  1. Abra una nueva ventana de Internet Explorer. Escriba la dirección http://localhost/test.htm. De nuevo, verá lo siguiente:
    Screenshot of the sample webpage in an Internet Explorer window.
  2. Para comprobar que el módulo ha generado seguimientos capturados, use una ventana de Internet Explorer con privilegios elevados por el administrador y presione CTRL-Oy, a continuación, vaya a c:\inetpub\logs\FailedReqLogFiles\W3SVC1. En el cuadro de lista desplegable que lee archivos HTML, seleccioneTodos los archivos.
  3. Seleccione el archivo fr######.xml más reciente (fecha de hoy) y haga clic en Abrir. Verá los eventos:
    Screenshot of the Request Diagnostics screen, showing the Custom Module Traces tab.

Resumen

Ha terminado de agregar un nuevo evento de seguimiento a un módulo administrado, compilar e implementar ese módulo, configurar System.Diagnostics para enrutar sus eventos a la infraestructura de seguimiento de IIS y, por último, configurar la característica de seguimiento de solicitudes erróneas de IIS para capturar sus eventos. Ahora puede agregar fácilmente nuevos eventos al módulo y volver a compilar el módulo e implementarlo en el directorio \bin. Con el seguimiento de solicitudes erróneas verá los resultados de los eventos.

Recuerde que el uso de System.Diagnostics.TraceSource le permite seguir utilizando su módulo y sus eventos de rastreo de nivel inferior, siempre que lo conecte a un agente de escucha de seguimiento diferente.