次の方法で共有


チュートリアル : ASP.NET Health Monitoring における WMI イベントの待機

更新 : 2007 年 11 月

このチュートリアルでは、ASP.NET Health Monitoring イベントに割り当てられている Windows Management Instrumentation (WMI) イベントを待機する方法について説明します。このチュートリアルでは、以下のタスクを行います。

  • 状態監視イベントを待機するコンソール アプリケーションを構築する。

  • 監視が行われるように Web アプリケーションを構成する。

  • コンソール アプリケーションをテストする。

WMI を使用して状態監視イベントを配信する方法の詳細については、「WMI による ASP.NET Health Monitoring イベントの配信」を参照してください。

前提条件

このチュートリアルを実行するための要件は次のとおりです。

  • Microsoft Internet Information Services (IIS) および .NET Framework Version 2.0 がインストールされたサーバーへのアクセス。

  • サーバー上で ASP.NET Web サイトを作成するためのアクセス許可。

  • Web イベント情報にアクセスできる管理者特権でアプリケーションを実行するためのアクセス許可。

ASP.NET Health Monitoring プロセス

イベント データの配信が WMI によって処理されるように構成されている場合に ASP.NET Health Monitoring で実行される主な手順を次に示します。

  1. ASP.NET が、構成設定に基づいて状態イベントを発生させる。

  2. ASP.NET Health Monitoring が、構成設定に基づいてイベントを WmiWebEventProvider プロバイダにディスパッチする。

  3. WmiWebEventProvider プロバイダが、ASP.NET (Aspnet.mof) の WMI MOF (Managed Object Format) ファイル内の情報に基づき、アンマネージ呼び出しを通じてイベント情報を WMI システムに渡す。

  4. WMI が関連データをカスタム アプリケーションに渡す。アプリケーションは System.Management 型を使用して、ASP.NET マネージ API と WMI アンマネージ API の相互運用を行います。

このプロセスを次の図に示します。

WMI による ASP.NET Health Monitoring プロセス
WMI リスナ

WMI を使用して ASP.NET Health Monitoring イベントを待機するときの手順

WMI を使用して ASP.NET Health Monitoring イベントを待機するときの標準的な手順は次のとおりです。

  1. カスタム リスナ アプリケーションを作成する。このチュートリアルでは、リスナ アプリケーションはコンソール アプリケーションです。

  2. 状態監視を有効にしてプロバイダを指定することにより、カスタム プロバイダが状態イベントを処理できるように Web アプリケーションを構成する。このチュートリアルでは、プロバイダは既定の WMI プロバイダです。

  3. Web アプリケーションを実行するサーバー上でリスナをアクティブにする。ここではリスナがコンソール アプリケーションであるため、コマンド ラインからアプリケーションを実行します。

  4. Web ブラウザで、監視対象の Web サイトの任意のページにアクセスする。

  5. Web サイトで発行された状態イベントがリスナにキャプチャされたことを確認する。

WMI イベント リスナの作成

WMI イベント リスナは、ASP.NET 状態イベントが WMI に転送された後に、それらを処理します。

次の手順のコード例は、ASP.NET 状態イベントに関連付けられている WMI オブジェクトにアクセスする WMI イベント リスナ コンソール アプリケーションのコードです。このアプリケーションによって実行される主な手順は次のとおりです。

  • リスナと Web アプリケーションを実行するコンピュータの名前を取得する。

  • ASP.NET のエンティティの WMI パスを設定する。

  • System.Management 名前空間で定義されているマネージ オブジェクト ウォッチャーを作成する。

  • 監視するイベントのスコープを、前に設定した WMI パスと等しくなるように設定する。

  • WMI イベントをキャッチするための無限ループを実行する。

ASP.NET 状態イベント用の WMI イベント リスナを作成するには

  1. コンソール アプリケーションのソース ファイルを作成し、次のコードを貼り付けます。このコードでは、ローカル コンピュータ (監視される Web アプリケーションを実行するコンピュータと同じコンピュータ) 上で ASP.NET Health Monitoring イベントに関連付けられている WMI イベントを待機します。

    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;
                    }
                }
            }
        }
    }
    
  2. コンソール アプリケーションを作成します。System.Management 名前空間の参照を含める必要がある場合もあります。

WMI イベント用のアプリケーションの構成

標準の WmiWebEventProvider プロバイダには、ASP.NET 状態イベントに関連付けられている WMI イベントを生成するためのロジックが含まれています。

WMI を使用して ASP.NET Health Monitoring イベントを待機するように ASP.NET アプリケーションを構成するには

  1. アプリケーションのルートで、Web.config ファイルを作成するかまたは開きます。

    基本的な Web.config ファイルは、次のコード例のようになります。

    <?xml version="1.0"?>
    <configuration xmlns="https://schemas.microsoft.com/.NetConfiguration/v2.0">
        <appSettings/>
        <connectionStrings/>
        <system.web>
        </system.web>
    </configuration>
    
  2. system.web セクション内に次のコードを追加して、状態監視を有効にします。

            <healthMonitoring enabled="true">
            </healthMonitoring>
    
  3. healthMonitoring セクション内に次のコードを追加して、アプリケーションが WmiWebEventProvider プロバイダを使用して状態監視データを配信するように構成します。WmiWebEventProvider プロバイダは設定済みであることに注意してください。Web イベントの処理を許可するには、次のように規則を定義するだけです。

               <rules>
                  <add 
                     name="Wmi Listener"
                     eventName="All Events" 
                     provider="WmiWebEventProvider" 
                     profile="Critical"/>
               </rules>
    

    追加した規則の eventName 属性により、すべての Web イベントが WmiWebEventProvider プロバイダにディスパッチされるようになります。

リスナ アプリケーションのテスト

リスナ アプリケーションを作成し、WMI による状態監視を有効にするように Web サイトを構成したら、Web サイトからページを要求しているときにリスナ アプリケーションを実行し、状態イベントがキャプチャされることを確認できます。

リスナ コンソール アプリケーションをテストするには

  1. 状態監視が有効になるように構成した Web アプリケーション内に ASP.NET ページを作成します。

  2. コマンド ラインからリスナ アプリケーションを実行します。

    コマンド ウィンドウの色が変わり、青い背景に黄色で次のテキストが表示されます。

    Listener started. Enter CntlC to terminate
    
  3. Web ブラウザで、Web アプリケーションからページを要求します。

    ページのレンダリングが完了する前に、リスナ アプリケーションを実行しているコマンド ウィンドウに次のテキストが表示されます。

    ASP.NET Event URL authorization succeeded for the request.
    ASP.NET Event File authorization succeeded for the request.
    

    これにより、リスナが ASP.NET からの URL 承認イベントとファイル承認イベントをキャッチしたことを確認できます。

次の手順

ここで示した WMI リスナは簡単なコンソール アプリケーションですが、WMI リスナを作成して、状態イベントをディスパッチするようにアプリケーションを構成するための基本的な手順を示しています。これを出発点として、他のさまざまな方法によって Web アプリケーションを監視できます。次に行う作業の例を示します。

  • Windows アプリケーションを使用して WMI イベントを収集する方法を調べる。

  • イベントの種類に応じて、より複雑な処理機能を使用する方法を調べる。

  • WMI と、その機能を .NET Framework が統合する方法について学習する。詳細については、「System.Management」および「System.Management.Instrumentation」を参照してください。

  • MSDN library で WMI (Windows Management Instrumentation) と MOF (Managed Object Format) を検索する。

参照

参照

healthMonitoring 要素 (ASP.NET 設定スキーマ)

WmiWebEventProvider

System.Management

System.Management.Instrumentation

その他の技術情報

WMI による ASP.NET Health Monitoring イベントの配信