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:
Haga clic en el botón Inicio -> Todos los programas -> Accesorios -> (clic derecho)Símbolo del sistema -> Ejecutar como administrador
Ejecute el siguiente comando en ese símbolo del sistema:
%windir%\system32\inetsrv\appcmd add backup
Paso 4: creación de contenido de ejemplo
- Elimine todo lo que hay en la carpeta
c:\inetpub\wwwroot
. - 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
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
- 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.
- 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.
- En el panel Conexiones, expanda el nombre del equipo local y, a continuación, Sitios, y haga clic en Sitio web predeterminado.
- En IIS en el panel central, haga doble clic en Módulos:
- 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:
- 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):
- Haga clic en OK. El módulo recién rastreado ahora está configurado para el uso del sitio web.
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:
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.
Con el símbolo del sistema administrador, vaya a
c:\inetpub\wwwroot
y use el Bloc de notas para editar el archivo web.config.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.
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.
Defina el traceSource por su nombre (tsStatus) y conéctelo al DefaultSwitch y IisTraceListener.
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:
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:
Active la casilla Habilitar. Acepte los valores predeterminados para las demás configuraciones. Haga clic en Aceptar para continuar.
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
En el panel Acciones, haga clic en Agregar... Esto inicia el asistente Agregar regla de seguimiento de solicitudes erróneas.
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.
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.
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.
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.
Haga clic en Finalizar Verá la siguiente definición para el sitio web predeterminado:
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:
- Abra una nueva ventana de Internet Explorer. Escriba la dirección
http://localhost/test.htm
. De nuevo, verá lo siguiente:
- 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. - Seleccione el archivo fr######.xml más reciente (fecha de hoy) y haga clic en Abrir. Verá los eventos:
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.