Tutorial: Escuchar eventos WMI en la supervisión de estado ASP.NET
Actualización: noviembre 2007
En este tutorial se muestra cómo escuchar los eventos de Instrumental de administración de Windows (WMI) que se han asignado a los eventos de supervisión de estado de ASP.NET. Las tareas ilustradas en este tutorial incluyen:
Generar una aplicación de consola que escuchas eventos de supervisión de estado.
Configurar una aplicación Web que se va a supervisar.
Probar la aplicación de consola.
Para obtener más información acerca de cómo utilizar WMI para entregar eventos de supervisión de estado, vea Utilizar WMI para entregar eventos de supervisión de estado en ASP.NET.
Requisitos previos
Para poder completar este tutorial, necesitará:
Acceso a un servidor con Servicios de Microsoft Internet Information Server (IIS) y la versión 2.0 de .NET Framework instalados.
Permisos suficientes para poder crear un sitio Web de ASP.NET en el servidor.
Permiso para ejecutar la aplicación con privilegios administrativos y obtener acceso a la información de los eventos Web.
Proceso de supervisión de estado en ASP.NET
En la lista siguiente se describen los pasos principales que tienen lugar durante la supervisión de estado de ASP.NET si la entrega de datos de eventos está configurada para su procesamiento mediante WMI:
ASP.NET provoca un evento de estado, según las opciones de configuración.
La supervisión de estado de ASP.NET, según las opciones de configuración, envía el evento al proveedor WmiWebEventProvider.
El proveedor WmiWebEventProvider, basándose en la información contenida en el archivo de Managed Object Format (MOF, Formato de objeto administrado) de WMI para ASP.NET (Aspnet.mof), pasa la información del evento al sistema WMI mediante una llamada no administrada.
Por último, WMI pasa los datos relevantes a la aplicación personalizada. Esta aplicación utiliza los tipos de System.Management para interoperar entre las API administradas de ASP.NET y las API no administradas de WMI.
En la siguiente ilustración se muestra este proceso.
Proceso de supervisión de estado en ASP.NET mediante WMI
Pasos implicados en el uso de WMI para escuchar eventos de supervisión de estado de ASP.NET
Los pasos estándar para utilizar WMI con el fin de escuchar eventos de supervisión de estado de ASP.NET son los siguientes:
Crear y generar una aplicación personalizada de agente de escucha. En este tutorial, la aplicación del agente de escucha es una aplicación de consola.
Configurar la aplicación Web para que permita al proveedor personalizado procesar los eventos de estado habilitando la supervisión de estado y especificando un proveedor. En este tutorial, el proveedor es el proveedor de WMI predeterminado.
Activar el agente de escucha en el servidor donde se ejecuta la aplicación Web. Como el agente de escucha es una aplicación de consola, esto significa ejecutar la aplicación desde la línea de comandos.
Tener acceso a cualquier página del sitio Web supervisado en un explorador Web.
Comprobar que el agente de escucha captura los eventos de estado emitidos por el sitio Web.
Crear el agente de escucha de eventos de WMI
Un agente de escucha de eventos de WMI procesa los eventos de estado de ASP.NET después de haberse reenviado a WMI.
El ejemplo de código del procedimiento siguiente corresponde a una aplicación de consola del agente de escucha de eventos de WMI que tiene acceso a los objetos de WMI asociados a eventos de estado de ASP.NET. En la lista siguiente se describen los pasos principales que realiza esta aplicación:
Obtener el nombre del equipo donde se ejecutan el agente de escucha y la aplicación Web.
Establecer la ruta de acceso WMI para las entidades de ASP.NET.
Crear un inspector de objetos administrados según se define en el espacio de nombres System.Management.
Establecer el ámbito de los eventos que se van a inspeccionar de manera que sea igual que la ruta de acceso WMI anterior.
Recorrer indefinidamente bucles para detectar los eventos de WMI.
Para crear un agente de escucha de eventos de WMI para los eventos de estado de ASP.NET
Cree un archivo de código fuente para una aplicación de consola y pegue el código siguiente. Este código escucha los eventos de WMI asociados a los eventos de supervisión de estado de ASP.NET del equipo local, que es el mismo equipo donde se ejecuta la aplicación Web supervisada.
Imports System Imports System.Text Imports System.Management Namespace SamplesAspNet Class SampleWmiWebEventListener ' Displays event-related information. Public Shared Sub DisplayEventInformation(ByVal ev As ManagementBaseObject) ' This will hold the name of the ' event class as defined in the ' Aspnet.mof file. Dim eventTypeName As String ' Get the name of the WMI-raised event. eventTypeName = ev.ClassPath.ToString() ' Process the raised event. Select Case eventTypeName ' Process the heartbeat event. Case "HeartBeatEvent" Console.WriteLine("HeartBeat") Console.WriteLine(vbTab + _ "Process: {0}", ev("ProcessName")) Console.WriteLine(vbTab + "App: {0}", _ ev("ApplicationUrl")) Console.WriteLine(vbTab + "WorkingSet: {0}", _ ev("WorkingSet")) Console.WriteLine(vbTab + "Threads: {0}", _ ev("ThreadCount")) Console.WriteLine(vbTab + "ManagedHeap: {0}", _ ev("ManagedHeapSize")) Console.WriteLine(vbTab + "AppDomainCount: {0}", _ ev("AppDomainCount")) ' Process the request error event. Case "RequestErrorEvent" Console.WriteLine("Error") Console.WriteLine("Url: {0}", _ ev("RequestUrl")) Console.WriteLine("Path: {0}", _ ev("RequestPath")) Console.WriteLine("Message: {0}", _ ev("EventMessage")) Console.WriteLine("Stack: {0}", _ ev("StackTrace")) Console.WriteLine("UserName: {0}", _ ev("UserName")) Console.WriteLine("ThreadID: {0}", _ ev("ThreadAccountName")) ' Process the application lifetime event. Case "ApplicationLifetimeEvent" Console.WriteLine("App Lifetime Event {0}", _ ev("EventMessage")) ' Handle events for which processing is not ' provided. Case Else Console.WriteLine("ASP.NET Event {0}", _ ev("EventMessage")) End Select End Sub 'DisplayEventInformation . ' The main entry point for the application. Public Shared Sub Main(ByVal args() As String) ' Get the name of the computer on ' which this program runs. ' Note that the monitored application must also run ' on this computer. Dim machine As String = Environment.MachineName ' Define the Common Information Model (CIM) path ' for WMI monitoring. Dim path As String = _ String.Format("\\{0}\root\aspnet", machine) ' Create a managed object watcher as ' defined in System.Management. Dim query As String = "select * from BaseEvent" Dim watcher As New ManagementEventWatcher(query) ' Set the watcher options. Dim timeInterval As New TimeSpan(0, 1, 30) watcher.Options = _ New EventWatcherOptions(Nothing, timeInterval, 1) ' Set the scope of the WMI events to ' watch to be ASP.NET applications. watcher.Scope = _ New ManagementScope(New ManagementPath(path)) ' Set the console background. Console.BackgroundColor = ConsoleColor.Blue ' Set the foreground color. Console.ForegroundColor = ConsoleColor.Yellow ' Clear the console. Console.Clear() ' Loop indefinitely to catch the events. Console.WriteLine( _ "Listener started. Enter CntlC to terminate.") While True Try ' Capture the WMI event related to ' the Web event. Dim ev As ManagementBaseObject = _ watcher.WaitForNextEvent() ' Display the Web event information. DisplayEventInformation(ev) ' Prompt the user. Console.Beep() Catch e As Exception Console.WriteLine("Error: {0}", e) Exit While End Try End While End Sub 'Main End Class 'SampleWmiWebEventListener End Namespace
using System; using System.Text; using System.Management; namespace SamplesAspNet { // Capture WMI events associated with // ASP.NET health monitoring types. class SampleWmiWebEventListener { // Displays event-related information. static void DisplayEventInformation( ManagementBaseObject ev) { // This will hold the name of the // event class as defined in the // Aspnet.mof file. string eventTypeName; // Get the name of the WMI-raised event. eventTypeName = ev.ClassPath.ToString(); // Process the raised event. switch (eventTypeName) { // Process the heartbeat event. case "HeartBeatEvent": Console.WriteLine("HeartBeat"); Console.WriteLine("\tProcess: {0}", ev["ProcessName"]); Console.WriteLine("\tApp: {0}", ev["ApplicationUrl"]); Console.WriteLine("\tWorkingSet: {0}", ev["WorkingSet"]); Console.WriteLine("\tThreads: {0}", ev["ThreadCount"]); Console.WriteLine("\tManagedHeap: {0}", ev["ManagedHeapSize"]); Console.WriteLine("\tAppDomainCount: {0}", ev["AppDomainCount"]); break; // Process the request error event. case "RequestErrorEvent": Console.WriteLine("Error"); Console.WriteLine("Url: {0}", ev["RequestUrl"]); Console.WriteLine("Path: {0}", ev["RequestPath"]); Console.WriteLine("Message: {0}", ev["EventMessage"]); Console.WriteLine("Stack: {0}", ev["StackTrace"]); Console.WriteLine("UserName: {0}", ev["UserName"]); Console.WriteLine("ThreadID: {0}", ev["ThreadAccountName"]); break; // Process the application lifetime event. case "ApplicationLifetimeEvent": Console.WriteLine("App Lifetime Event {0}", ev["EventMessage"]); break; // Handle events for which processing is not // provided. default: Console.WriteLine("ASP.NET Event {0}", ev["EventMessage"]); break; } } // End DisplayEventInformation. // The main entry point for the application. static void Main(string[] args) { // Get the name of the computer on // which this program runs. // Note that the monitored application must also run // on this computer. string machine = Environment.MachineName; // Define the Common Information Model (CIM) path // for WMI monitoring. string path = String.Format("\\\\{0}\\root\\aspnet", machine); // Create a managed object watcher as // defined in System.Management. string query = "select * from BaseEvent"; ManagementEventWatcher watcher = new ManagementEventWatcher(query); // Set the watcher options. TimeSpan timeInterval = new TimeSpan(0, 1, 30); watcher.Options = new EventWatcherOptions(null, timeInterval, 1); // Set the scope of the WMI events to // watch to be ASP.NET applications. watcher.Scope = new ManagementScope(new ManagementPath(path)); // Set the console background. Console.BackgroundColor = ConsoleColor.Blue; // Set the foreground color. Console.ForegroundColor = ConsoleColor.Yellow; // Clear the console. Console.Clear(); // Loop indefinitely to catch the events. Console.WriteLine( "Listener started. Enter Cntl-C to terminate"); while (true) { try { // Capture the WMI event related to // the Web event. ManagementBaseObject ev = watcher.WaitForNextEvent(); // Display the Web event information. DisplayEventInformation(ev); // Prompt the user. Console.Beep(); } catch (Exception e) { Console.WriteLine("Error: {0}", e); break; } } } } }
Genere la aplicación de consola. Quizás tenga que incluir una referencia al espacio de nombres System.Management.
Configurar la aplicación para eventos de WMI
El proveedor WmiWebEventProvider estándar contiene la lógica para generar los eventos de WMI asociados a los eventos de estado de ASP.NET.
Para configurar una aplicación ASP.NET de manera que utilice WMI para escuchar eventos de supervisión de estado de ASP.NET
Cree o abra un archivo Web.config en la raíz de su aplicación.
Un archivo Web.config básico es similar al ejemplo de código siguiente.
<?xml version="1.0"?> <configuration xmlns="https://schemas.microsoft.com/.NetConfiguration/v2.0"> <appSettings/> <connectionStrings/> <system.web> </system.web> </configuration>
Habilite la supervisión de estado agregando las líneas siguientes de código dentro de la sección system.web.
<healthMonitoring enabled="true"> </healthMonitoring>
Configure la aplicación para que utilice el proveedor WmiWebEventProvider con el fin de entregar datos de supervisión de estado agregando las líneas siguientes de código dentro de la sección healthMonitoring. Tenga en cuenta que el proveedor WmiWebEventProvider ya está configurado. Para permitir el procesamiento de eventos Web, sólo es preciso definir una regla de la manera siguiente.
<rules> <add name="Wmi Listener" eventName="All Events" provider="WmiWebEventProvider" profile="Critical"/> </rules>
El atributo eventName de la regla agregada permite enviar todos los eventos Web al proveedor WmiWebEventProvider.
Probar la aplicación del agente de escucha
Después de haber creado y generado la aplicación del agente de escucha, y de haber configurado un sitio Web para habilitar la supervisión de estado mediante eventos de WMI, puede comprobar que se capturan los eventos de estado si ejecuta la aplicación del agente de escucha mientras solicita una página al sitio Web.
Para probar la aplicación de consola del agente de escucha
Cree una página ASP.NET en la misma aplicación Web que configuró para habilitar la supervisión de estado.
Desde la línea de comandos, ejecute la aplicación del agente de escucha.
La ventana de comandos cambiará de color y mostrará un fondo azul con el texto amarillo siguiente:
Listener started. Enter CntlC to terminate
En un explorador Web, solicite la página a su aplicación Web.
Antes de que finalice la representación de la página, la ventana de comandos que está ejecutando la aplicación del agente de escucha mostrará el texto siguiente:
ASP.NET Event URL authorization succeeded for the request. ASP.NET Event File authorization succeeded for the request.
Esto comprueba que el agente de escucha ha detectado el evento de autorización de URL y el evento de autorización de archivo de ASP.NET.
Pasos siguientes
El agente de escucha de WMI mostrado es una aplicación de consola sencilla, pero ilustra los pasos fundamentales para generar un agente de escucha de WMI y configurar una aplicación para que envíe eventos de estado. De aquí puede empezar a explorar otras maneras de supervisar sus aplicaciones Web. Sugerencias para una exploración más a fondo incluyen las siguientes:
Investigue el uso de aplicaciones para Windows con el fin de recopilar eventos de WMI.
Explore el uso de funciones de procesamiento más complejas basándose en el tipo de evento.
Obtenga información acerca de WMI y cómo .NET Framework integra su funcionalidad. Para obtener más información, vea System.Management, System.Management.Instrumentation.
Busque en MSDN library Instrumental de administración de Windows (WMI) y Managed Object Format (MOF).
Vea también
Referencia
Elemento healthMonitoring (esquema de configuración de ASP.NET)
System.Management.Instrumentation
Otros recursos
Utilizar WMI para entregar eventos de supervisión de estado en ASP.NET