Información general sobre la supervisión de estado en ASP.NET

Actualización: noviembre 2007

La supervisión de estado en ASP.NET permite a los administradores de sistema supervisar el estado de las aplicaciones web implementadas.

Nota:

Se necesita un nivel de confianza medio o superior para provocar un evento de supervisión de estado.

Este tema contiene:

  • Escenarios

  • Características de la supervisión de estado de ASP.NET

  • Información general

  • Ejemplos de código

  • Referencia de clase

Escenarios

La supervisión de estado de ASP.NET permite realizar las tareas siguientes:

  • Supervisar el rendimiento de una aplicación para garantizar que funciona correctamente.

  • Diagnosticar rápidamente aplicaciones o sistemas que presentan problemas.

  • Evaluar eventos significativos durante el ciclo de vida de una aplicación.

  • Supervisar las aplicaciones ASP.NET activas, por separado o en una batería de servidores Web.

  • Registrar eventos no necesariamente relacionados con errores de una aplicación ASP.NET.

Volver al principio de la página

Características

El sistema de supervisión de estado de ASP.NET incluye:

  • Tipos de evento que empaquetan información sobre el estado de la aplicación.

  • Tipos de proveedor que procesan información de eventos.

  • Tipos adicionales que ayudan a administrar los eventos de estado.

Volver al principio de la página

Información general

La supervisión de estado de ASP.NET proporciona una manera fácil de supervisar el estado de una aplicación ASP.NET y de obtener información detallada en tiempo de ejecución sobre los recursos de ASP.NET (para instrumentar la aplicación). La supervisión de estado contiene clases de eventos de supervisión de estado web (eventos web) y proveedores de supervisión de estado (agentes de escucha) listos para usar. Los eventos web empaquetan información de eventos de estado.

Los proveedores realizan escuchas en los eventos y consumen la información de evento, normalmente mediante el registro de la información o su notificación a un administrador. Puede conectar un evento web a un proveedor (lo que se denomina habilitar el evento) si establece la configuración en el archivo de configuración de la aplicación.

El sistema de supervisión de estado de ASP.NET se implementa mediante clases en el espacio de nombres System.Web.Management.

Configurar la supervisión de estado en ASP.NET

Puede configurar las aplicaciones para que usen proveedores de supervisión integrados o personalizados que procesen esta información de supervisión de estado e informen sobre el estado y las características de rendimiento de la aplicación instrumentada.

Los proveedores y eventos web se agregan a una aplicación mediante la configuración de la sección healthMonitoring del archivo de configuración. A continuación usa clases integradas o personalizadas para realizar escuchas de los datos de evento y procesarlos.

Para obtener más información sobre los archivos de configuración, vea Archivos de configuración de ASP.NET.

Jerarquía de clases de eventos web

Cuando se provoca un evento Web, se crea una instancia de la clase de evento asociada. Los datos del evento se recogen en las propiedades de este objeto. Los proveedores de eventos procesan estos datos.

Los eventos Web pueden contener información sobre el proceso de trabajo, el dominio de aplicación, los datos de solicitud, los datos de respuesta, los errores de aplicación y de configuración, así como los eventos de auditoría. Todas las clases de evento secundarias heredan la información de estado de una clase de evento primaria.

En la siguiente ilustración se muestran las relaciones entre las clases de eventos web.

Jerarquía de clases de eventos Web

Cuanto más profundo está un evento en la jerarquía de clases de eventos web, más específicos son los datos de la aplicación ASP.NET. Por ejemplo, las clases derivadas pueden exponer información como las trazas de pila, IP de cliente e información sobre subprocesos y procesos.

Información de eventos Web

La tabla siguiente incluye información que ayuda a decidir qué clase de evento web se debe usar o de cuál se debe heredar. Las filas hacen referencia a las clases de eventos web. Las columnas hacen referencia a las clases de información, que normalmente están disponibles como propiedades en las clases de eventos web.

Si la aplicación no se está ejecutando con plena confianza, sólo se puede heredar la clase WebBaseEvent. Esto ayuda a proteger contra la exposición de información confidencial a través de las clases de información mostradas en la tabla.

Clases de eventos Web

WebApplicationInformation

WebProcessInformation

WebProcessStatistics

WebRequestInformation

WebThreadInformation

WebBaseEvent

Datos generados por esta clase

No está disponible

No está disponible

No está disponible

No está disponible

WebManagementEvent

Datos generados por la clase primaria

Datos generados por esta clase

No está disponible

No está disponible

No está disponible

WebHeartbeatEvent

Datos generados por la clase primaria

Datos generados por la clase primaria

Datos generados por esta clase

No está disponible

No está disponible

WebRequestEvent

Datos generados por la clase primaria

Datos generados por la clase primaria

No está disponible

Datos generados por esta clase

No está disponible

WebApplicationLifetimeEvent

Datos generados por la clase primaria

Datos generados por la clase primaria

No está disponible

No está disponible

No está disponible

WebBaseErrorEvent

Datos generados por la clase primaria

Datos generados por la clase primaria

No está disponible

No está disponible

No está disponible

WebErrorEvent

Datos generados por la clase primaria

Datos generados por la clase primaria

No está disponible

Datos generados por esta clase

Datos generados por esta clase

WebRequestErrorEvent

Datos generados por la clase primaria

Datos generados por la clase primaria

No está disponible

Datos generados por la clase primaria

Datos generados por la clase primaria

WebAuditEvent

Datos generados por la clase primaria

Datos generados por la clase primaria

No está disponible

Datos generados por esta clase

No está disponible

WebSuccessAuditEvent

Datos generados por la clase primaria

Datos generados por la clase primaria

No está disponible

Datos generados por la clase primaria

No está disponible

WebAuthenticationSuccessAuditEvent

Datos generados por la clase primaria

Datos generados por la clase primaria

No está disponible

Datos generados por la clase primaria

No está disponible

WebFailureAuditEvent

Datos generados por la clase primaria

Datos generados por la clase primaria

No está disponible

Datos generados por la clase primaria

No está disponible

WebAuthenticationFailureAuditEvent

Datos generados por la clase primaria

Datos generados por la clase primaria

No está disponible

Datos generados por la clase primaria

No está disponible

WebViewStateFailureAuditEvent

Datos generados por la clase primaria

Datos generados por la clase primaria

No está disponible

Datos generados por la clase primaria

No está disponible

Jerarquía de clases de proveedores

ASP.NET incluye proveedores integrados que se pueden utilizar para procesar los eventos Web. También se puede heredar de las clases integradas para crear un proveedor personalizado, sujeto a las siguientes limitaciones de herencia:

  • Las aplicaciones que se ejecutan con cualquier nivel de confianza pueden heredar la clase WebEventProvider.

  • Las aplicaciones que se ejecutan con cualquier nivel de confianza pueden heredar la clase BufferedWebEventProvider.

  • Sólo las aplicaciones que se ejecutan con plena confianza pueden heredar la clase SqlWebEventProvider.

Las demás clases no las pueden heredar las aplicaciones, independientemente del nivel de confianza. Para obtener más información, vea las información general de las clases de proveedor individuales.

La siguiente ilustración muestra la relación entre las clases de proveedor web del espacio de nombres System.Web.Management.

Jerarquía de clases de proveedores Web

Usar los eventos de supervisión de estado de ASP.NET

Puede trabajar con los eventos de supervisión de estado de ASP.NET de las maneras siguientes:

  • Utilizar clases de proveedor y de evento Web integradas. Normalmente, no será necesario proporcionar implementaciones personalizadas de las clases de evento web de ASP.NET. Tenga en cuenta que la aplicación no provoca estos eventos sino que lo hace .NET Framework. Sin embargo, debe configurarlos como se explica más adelante en este tema. Para obtener más información, consulte Cómo: Enviar un correo electrónico para las notificaciones de supervisión de estado.

  • Crear clases personalizadas para eventos web o proveedores. Los eventos web personalizados normalmente se crean cuando se debe anexar información personalizada a la que ya proporcionan los eventos web integrados. Los proveedores personalizados se crean normalmente si se desea entregar los datos de eventos a través de un mecanismo distinto del que proporcionan los proveedores integrados. Para obtener más información, vea Extender eventos de supervisión de estado de ASP.NET.

Utilizar eventos Web y proveedores integrados

El uso de eventos web integrados y proveedores para la supervisión de estado es la estrategia más común. Sólo requiere configurar la aplicación para usar los eventos y proveedores necesarios. Debe hacer lo siguiente:

  • Agregue la clase de evento web integrada de ASP.NET que necesita al elemento eventMappings de la sección healthMonitoring en el archivo de configuración de la aplicación.

  • Agregue el proveedor que utilice el evento al elemento providers de la sección healthMonitoring.

  • Agregue un elemento al elemento rules que define la asociación entre el evento y el proveedor.

De forma predeterminada, las clases de supervisión de estado integradas de ASP.NET se configuran en la sección healthMonitoring del archivo Web.config de la raíz. En la sección healthMonitoring se establece la siguiente configuración predeterminada:

  • Todas las clases de evento Web que se deriven de WebBaseEvent se especifican en el elemento eventMappings. Esta sección se utiliza para asignar un nombre descriptivo a un grupo de clases de evento.

  • Todas las clases de evento que derivan de WebBaseEvent se incluyen al menos en uno de los grupos definidos en el elemento eventMappings.

Los proveedores de eventos EventLogWebEventProvider, WmiWebEventProvider y SqlWebEventProvider se especifican en el elemento providers. Puede especificar otros proveedores integrados en el elemento providers, como las clases SimpleMailWebEventProvider, TemplatedMailWebEventProvider o TraceWebEventProvider.

Las reglas que asocian el error Web y los eventos de error de auditoría a las clases EventLogWebEventProvider se especifican en el elemento rules. Puede habilitar otros eventos web y proveedores si agrega más elementos rules. Un evento se considera habilitado si está asignado a un proveedor de eventos en el elemento rules. Debe configurar los elementos eventMappings y providers para el evento pero, a menos que ambos estén conectados en el elemento rules, el evento no estará habilitado.

Puede especificar los valores de parámetro de los elementos configurados. Entre los ejemplos se incluyen parámetros que limitan el número de eventos que se pueden producir, que especifican el intervalo entre dos eventos o que especifican las opciones de almacenamiento en búfer de los eventos para los proveedores de correo y SQL.

Configurar un proveedor personalizado

Si debe procesar de forma personalizada la información de un evento web, puede generar un proveedor de eventos de estado personalizado. El proveedor es una clase que hereda de las clases WebEventProvider o BufferedWebEventProvider. Para obtener un ejemplo, vea Cómo: Implementar el ejemplo de proveedor personalizado de supervisión de estado. La creación de un proveedor personalizado es la personalización de supervisión de estado más común. Requiere modificar el archivo de configuración de las maneras siguientes:

  • Agregue el proveedor personalizado que procesa el evento al elemento providers de la sección healthMonitoring en el archivo de configuración.

  • Agregue un elemento al elemento rules que define la asociación entre el evento y el proveedor.

  • Coloque el ensamblado que contiene la implementación del proveedor personalizado en el subdirectorio Bin de la aplicación. No se puede colocar el archivo de código fuente del proveedor en el subdirectorio App_Code, porque el sistema de supervisión de estado se configura y se crea antes de que se compilen los archivos de código del subdirectorio App_Code.

El atributo type del elemento providers requiere por lo menos el nombre de clase. Si el ensamblado no está en el directorio Bin de la aplicación, deberá tener un nombre seguro e deberá instalarse en la caché de ensamblados global (GAC). En ese caso, el atributo type del elemento providers requiere el nombre seguro completo, tal como se muestra en el siguiente ejemplo de código, donde los valores de Version y PublicKeyToken coinciden con el ensamblado:

type="Microsoft.Samples.Web.Management.SampleCustomEventProvider, Sample.SampleCustomEventProvider,Version=n.n.n.n,Culture=neutral, PublicKeyToken=xxxx"

En el siguiente ejemplo se muestra cómo asociar el proveedor SampleCustomEventProvider al evento WebHeartbeatEvent. El evento Heartbeats ya está configurado en el archivo raíz Web.config.

<healthMonitoring 
  heartBeatInterval="1" 
  enabled="true">
  <rules>
    <add 
      name="Heartbeat Events" 
      eventName="Heartbeats" 
      provider="Sample Custom Event Provider"
      profile="Default" 
      minInstances="1" 
      maxLimit="Infinite" 
      minInterval="00:01:00"
      custom="" 
    />
  </rules>
  <providers>
    <add 
      name="Sample Custom Event Provider" 
      type="Microsoft.Samples.Web.Management.SampleCustomEventProvider, Sample.SampleCustomEventProvider,Version=1.0.0.0,Culture=neutral, PublicKeyToken=xxxxxxxxxxxx" 
    />
  </providers>
</healthMonitoring>

Configurar un evento personalizado

Si se requiere información de eventos de estado personalizados, se puede generar un evento de estado personalizado. Para consultar un ejemplo, vea Cómo: Implementar y provocar eventos personalizados de supervisión de estado de ASP.NET. Crear un evento Web personalizado es menos común que crear un proveedor personalizado. Requiere modificar el archivo de configuración. También debe provocar explícitamente el evento personalizado en el momento adecuado.

Para configurar el evento, debe realizar lo siguiente:

  • Agregue la clase de eventos de estado personalizados al elemento eventMappings de la sección healthMonitoring.

  • Agregue un elemento rules que defina la asociación entre el evento y el proveedor.

  • Agregue el ensamblado que contiene la implementación del evento web personalizado al subdirectorio bin de la aplicación ASP.NET. También puede agregar el archivo de código fuente del evento al subdirectorio App_Code.

Si utiliza un ensamblado, el atributo type del elemento eventMappings requiere al menos el nombre de la clase y el nombre de archivo del ensamblado, tal como se muestra en el siguiente ejemplo de código:

type="System.Web.Management.SampleCustomWebEvent, Sample.SampleCustomWebEvent"

Si usa un archivo de código fuente, sólo debe especificar el nombre de la clase.

En el ejemplo siguiente se muestra cómo asociar el proveedor de eventos EventLogWebEventProvider a un evento personalizado denominado SampleCustomWebEvent. El proveedor de eventos EventLogProvider ya está configurado en el archivo raíz Web.config.

<healthMonitoring 
  heartBeatInterval="0" 
  enabled="true">
  <rules>
    <add 
      name="Sample Custom Events" 
      eventName="SampleCustomWebEvent" 
      provider="EventLogProvider"
      profile="Default" 
      minInstances="1" 
      maxLimit="Infinite" 
      minInterval="00:01:00"
      custom="" 
    />
  </rules>
  <eventMappings>
    <add 
      name="SampleCustomWebEvent" 
      type="System.Web.Management.SampleCustomWebEvent, Sample.SampleCustomWebEvent,Version=1.0.0.0,Culture=neutral, PublicKeyToken=xxxxxxxxxxxx" "
      startEventCode="0" 
      endEventCode="2147483647" 
    />
  </eventMappings>
</healthMonitoring>

Proteger la supervisión de estado de ASP.NET

De forma predeterminada, la característica de supervisión de estado está habilitada para las aplicaciones ASP.NET. Se puede deshabilitar si se establece el atributo enabled del elemento healthMonitoring en false. Las opciones de configuración predeterminadas se establecen en los valores más seguros disponibles. Para obtener más información sobre la configuración de la supervisión de estado, vea healthMonitoring. Considere la posibilidad de bloquear las opciones de configuración de supervisión de estado con el elemento location.

Nota:

Al implementar consumidores de eventos personalizados o proveedores de eventos personalizados, debe codificar o comprobar el contenido de los eventos para evitar conflictos de scripting entre sitios.

Proteger los valores de configuración

Si almacena información confidencial en el archivo de configuración de una aplicación, debe cifrar los valores confidenciales mediante configuración protegida. Entre la información especialmente confidencial se encuentran las claves de cifrado almacenadas en el elemento de configuración machineKey y las cadenas de conexión a un origen de datos almacenadas en el elemento de configuración connectionStrings. Para obtener más información, consulte Cifrar información de configuración mediante una configuración protegida.

Sólo el código que utiliza el nivel de confianza medio o superior puede tener acceso sólo a la sección de configuración healthMonitoring. Esto evita que las aplicaciones con poca confianza puedan registrar los tipos personalizados.

Seguridad para extender la supervisión de estado

Los tipos de supervisión de estado del espacio de nombres System.Web.Management tienen las características siguientes:

  • Los constructores de clase base se marcan como protectedinternal. Por tanto, el código de usuario no puede crear directamente instancias de los tipos de eventos de la clase base.

  • El acceso a las instancias de eventos Web está limitado a los filtros, las páginas de plantilla y los proveedores especificados por la configuración.

  • Las peticiones de vínculos de herencia de los eventos con contenido protegido garantizan que sólo se pueden derivar los eventos personalizados de plena confianza.

  • Los eventos de confianza personalizados que exponen datos confidenciales de las propiedades de evento protegidas deben imponer la seguridad de acceso a código ellos mismos para evitar atraer los ataques. Para obtener detalles sobre la seguridad de acceso a código, vea Seguridad de acceso a código de ASP.NET o Conceptos básicos sobre la seguridad de acceso a código.

  • Los tipos de Instrumental de administración de Windows (WMI) utilizados para ver los eventos web se bloquean para impedir que todos los usuarios tengan acceso a los datos de eventos.

    Nota:

    Al implementar consumidores de eventos personalizados o proveedores de eventos personalizados, debe codificar o comprobar el contenido de los eventos para evitar conflictos de scripting entre sitios.

Proteger las conexiones a los orígenes de datos

Puede crear proveedores de eventos de supervisión de estado personalizados para registrar los datos de los eventos en una base de datos. ASP.NET incluye un proveedor de SQL. Para obtener más información acerca de cómo registrar datos de eventos, vea Proteger el acceso a datos.

Para proteger la conexión al servidor de base de datos, debe cifrar la información de la cadena de conexión del archivo de configuración mediante configuración protegida. Para obtener más información, vea Cifrar información de configuración mediante una configuración protegida.

Cuando usa un proveedor de SQL, debe proteger la base de datos de forma adecuada mediante autenticación. Los archivos Microsoft SQL Server Express Edition se deben proteger por medio de listas de control de acceso (ACL) y autenticación SQL.

Nota:

SQL Server Express Edition no se debe ejecutar en una cuenta sin privilegios al registrar eventos en una base de datos.

Protección contra los ataques de denegación de servicio

Los eventos web se pueden desencadenar mediante una solicitud HTTP o mediante código de aplicación que genere excepciones o eventos. Si se produce un volumen alto de eventos o eventos grandes, se puede superar la capacidad del proveedor de eventos. En este caso, el servidor o la aplicación ASP.NET pueden verse desbordados, lo que podría afectar al uso de la memoria, al espacio en disco y al tráfico en la red.

Para reducir la exposición de una aplicación a un ataque de denegación de servicio, ASP.NET utiliza de forma predeterminada el siguiente diseño:

  • ASP.NET mide una instancia de un evento por minuto. Esta frecuencia de límite se configura en el elemento profiles y se asocia con eventos y proveedores del elemento rules.

  • El almacenamiento de eventos en búfer se aísla para cada tipo de proveedor con el fin de evitar la competición por el espacio en búfer. Los ajustes del búfer se configuran en el elemento bufferModes. Los proveedores se pueden configurar de manera que usen un conjunto concreto de opciones de configuración de búfer mediante la especificación de un elemento bufferModes que contenga los ajustes necesarios.

  • Para provocar un evento personalizado, se requiere un nivel de confianza medio o superior.

Como administrador del sistema, puede configurar los ajustes de límite y almacenamiento en búfer con el fin de evitar el desbordamiento, especialmente en el caso de los eventos que se pueden desencadenar con solicitudes HTTP. Además, puede configurar modos de búfer independientes para tratar los eventos importantes y los no importantes.

Seguridad para los mensajes de error y eventos

Para evitar que información confidencial se exponga a orígenes no deseados, configure la aplicación de forma que no muestre mensajes de error detallados. También puede configurar la aplicación para que sólo muestre mensajes de error detallados cuando el cliente sea el propio servidor web. Para obtener más información, vea customErrors.

De forma predeterminada, ASP.NET registra los eventos Web bajo demanda, excepcionales y de gran volumen en el sistema de supervisión de rendimiento. En la configuración predeterminada, esto significa que los intentos de inicio de sesión en los que se producen errores incluirán los nombres de usuario y otra información de diagnóstico en el registro de eventos de la aplicación. Estos datos se pueden ver en el Visor de eventos de Windows. Si el servidor ejecuta uno de los productos de Microsoft Windows Server, puede mejorar la seguridad de la aplicación mediante la protección del registro de eventos. También puede establecer parámetros para especificar el tamaño, la retención y otras características del registro de eventos, e impedir así un ataque indirecto por denegación de servicio.

Bloquear la configuración de la supervisión de estado de ASP.NET

En los casos de hospedaje de aplicaciones, con frecuencia se desean bloquear algunas opciones en un sitio para impedir modificaciones. Por ejemplo, puede bloquear la configuración de la supervisión de estado para las aplicaciones hospedadas con el fin de reducir el riesgo de modificaciones accidentales en la configuración de la aplicación web.

Los valores de configuración se pueden bloquear agregando un atributo allowOverride="false" en una etiqueta <location>. Esto provoca que el sistema de configuración genere un error si un archivo de configuración ubicado en un nivel inferior de la jerarquía intenta reemplazar una sección de configuración definida en el elemento location.

El siguiente archivo de configuración de ejemplo muestra cómo bloquear la sección healthMonitoring de una aplicación ASP.NET denominada application1. La configuración se pudo almacenar en el nivel de servidor (en el archivo machine.config) o en el nivel de sitio.

<configuration>
  <location path="application1" allowOverride="false">
    <system.web>
      <healthMonitoring
        enabled="true"
        heartBeatInterval="60">
        <bufferModes>
          <add name="Logging"
            maxBufferSize="1000"
            maxFlushSize="200"
            urgentFlushThreshold="800"
            regularFlushInterval="00:30:00"
            urgentFlushInterval="00:05:00"
            maxBufferThreads="1"
          />
        </bufferModes>
        <providers>
           <add name="EventLogProvider"
            type="System.Web.Management.EventLogWebEventProvider, System.Web, Version=%ASSEMBLY_VERSION%, Culture=neutral, PublicKeyToken=%MICROSOFT_PUBLICKEY%"
            buffer="true"
            bufferMode="Logging"
          />
        </providers>
        <eventMappings>
          <add name="All Errors"
            type="System.Web.Management.WebBaseErrorEvent, System.Web, Version=%ASSEMBLY_VERSION%, Culture=neutral, PublicKeyToken=%MICROSOFT_PUBLICKEY%" 
          />
        </eventMappings>
        <profiles>
          <add name="Default"
            minInstances="1"
            maxLimit="Infinite"
            minInterval="00:10:00"
          />
        </profiles>
        <rules>
          <add name="All Errors Default"
            eventName="All Errors"
            provider="EventLogProvider"
            profile="Default"
            minInterval="00:01:00" 
          />
        </rules>
      </healthMonitoring>
    </system.web>
  </location>
</configuration>

Puede bloquear elementos con mayor granularidad si usa atributos adicionales como lockItem, lockAttributes y lockElements. Para obtener más información, consulte Atributos generales heredados por elementos de una sección.

Volver al principio de la página

Ejemplos de código

Cómo: Implementar y provocar eventos personalizados de supervisión de estado de ASP.NET

Cómo: Implementar el ejemplo de proveedor personalizado de supervisión de estado

Cómo: Enviar un correo electrónico para las notificaciones de supervisión de estado.

Tutorial: Escuchar eventos WMI en la supervisión de estado ASP.NET

Volver al principio de la página

Referencia de clase

  • System.Web.Management
    El espacio de nombres que contiene los tipos que permiten administrar y supervisar el estado de las aplicaciones web.

  • System.Management
    El espacio de nombres que contiene los tipos que permiten conectarse a la infraestructura de Instrumental de administración de Windows (WMI).

  • System.Management.Instrumentation
    El espacio de nombres que contiene los tipos que permiten instrumentar aplicaciones para consumidores potenciales de WMI.

  • HealthMonitoringSection
    El tipo que mediante programación obtiene o establece los atributos de configuración de healthMonitoring.

Volver al principio de la página

Vea también

Tareas

Cómo: Bloquear los valores de configuración de ASP.NET

Conceptos

Extender eventos de supervisión de estado de ASP.NET

Información general sobre la configuración de ASP.NET

Referencia

Elemento bufferModes para healthMonitoring (Esquema de configuración de ASP.NET)

Elemento providers para healthMonitoring (Esquema de configuración de ASP.NET)