WCF 分析トレース

WCFAnalyticTracingExtensibility サンプルでは、Windows Communication Foundation (WCF) で .NET Framework の ETW に書き込まれる分析トレースのストリームに独自のトレース イベントを追加する方法を示します。 分析トレースは、パフォーマンスを低下させずに簡単にサービスを確認できるようにするためのものです。 このサンプルでは、System.Diagnostics.Eventing API を使用して、WCF サービスと統合されるイベントを記述する方法を示します。

System.Diagnostics.Eventing API の詳細については、「System.Diagnostics.Eventing」を参照してください。

Windows でのイベント トレーシングの詳細については、「ETW によりデバッグおよびパフォーマンス調整を改善する」を参照してください。

EventProvider の破棄

このサンプルでは、System.Diagnostics.Eventing.EventProvider を実装した System.IDisposable クラスを使用します。 WCF サービスのトレースを実装する場合、サービスの有効期間に EventProvider のリソースを使用することがあります。 そのため、読みやすくするためにも、このサンプルでは、ラップされた EventProvider を破棄しません。 何かの理由で、サービスに対して別のトレースの要件を設定し、このリソースを破棄しなければならない場合は、アンマネージ リソースの破棄に関するベスト プラクティスに従ってこのサンプルを変更してください。 アンマネージ リソースの破棄の詳細については、「Dispose メソッドの実装」を参照してください。

自己ホスト型と Web ホスト型

Web ホスト型サービスの場合は、WCF の分析トレースで "HostReference" というフィールドが設定され、そのフィールドを使用してトレースの生成元のサービスを識別します。 拡張可能なユーザー トレースをこのモデルに加えることができます。このサンプルで、そのためのベスト プラクティスを示します。 結果の文字列にパイプ文字 '|' が実際に表示さるときには、Web ホストの参照の形式は次のいずれかになります。

  • アプリケーションがルート以外にある場合

    <サイト名><アプリケーション仮想パス>|<サービス仮想パス>|<サービス名>

  • アプリケーションがルートにある場合

    <サイト名>|<サービス仮想パス>|<サービス名>

自己ホスト型サービスの場合は、WCF の分析トレースで "HostReference" フィールドが設定されません。 このサンプルの WCFUserEventProvider クラスは、自己ホスト型サービスで使用した場合も同じように動作します。

カスタム イベントの詳細

WCF の ETW イベント プロバイダー マニフェストには、WCF サービスの作成者がサービス コード内から生成できるように設計された 3 つのイベントが定義されています。 次の表に、その 3 つのイベントの概要を示します。

Event 説明 イベント ID
UserDefinedInformationEventOccurred このイベントは、問題以外の通知すべき処理がサービスで発生した場合に生成します。 たとえば、データベースの呼び出しに成功した後にイベントを生成します。 301
UserDefinedWarningOccurred このイベントは、後続の処理でエラーになる可能性がある問題が発生した場合に生成します。 たとえば、データベースの呼び出しが失敗したものの、冗長なデータ ストアを使用して回復できた場合に警告イベントを生成します。 302
UserDefinedErrorOccurred このイベントは、サービスが想定どおりに動作しなかった場合に生成します。 たとえば、データベースの呼び出しが失敗し、別の場所からもデータを取得できなかった場合にイベントを生成します。 303

このサンプルを使用するには

  1. Visual Studio を使用して、WCFAnalyticTracingExtensibility.sln ソリューション ファイルを開きます。

  2. ソリューションをビルドするには、Ctrl+Shift+B キーを押します。

  3. ソリューションを実行するには、Ctrl キーを押しながら F5 キーを押します。

    Web ブラウザーで、 [Calculator.svc] をクリックします。 サービスの WSDL ドキュメントの URI がブラウザーに表示されます。 その URI をコピーします。

  4. WCF テスト クライアント (WcfTestClient.exe) を実行します。

    WCF テスト クライアント (WcfTestClient.exe) は \<Visual Studio Install Dir>\Common7\IDE\WcfTestClient.exe にあります。

  5. WCF テスト クライアントで、 [ファイル][サービスの追加] の順に選択して、サービスを追加します。

    入力ボックスにエンドポイントのアドレスを追加します。

  6. [OK] をクリックしてダイアログ ボックスを閉じます。

    ICalculator サービスが、左側のウィンドウの [マイ サービス プロジェクト] の下に追加されます。

  7. イベント ビューアー アプリケーションを開きます。

    サービスを呼び出す前に、イベント ビューアーを起動し、WCF サービスから生成された追跡イベントをイベント ログでリッスンしていることを確認します。

  8. [スタート] ボタンをクリックし、 [管理ツール] をポイントしてから [イベント ビューアー] をクリックします。 [分析] および [デバッグ] ログを有効にします。

  9. イベント ビューアーのツリー ビューで、 [イベント ビューアー][アプリケーションとサービス ログ][Microsoft][Windows][アプリケーション サーバー - アプリケーション] の順に移動します。 [アプリケーション サーバー - アプリケーション] を右クリックし、 [表示][分析およびデバッグ ログの表示] の順に選択します。

    [分析およびデバッグ ログの表示] オプションがオンになっていることを確認します。 [分析] ログを有効にします。

    イベント ビューアーのツリー ビューで、 [イベント ビューアー][アプリケーションとサービス ログ][Microsoft][Windows][アプリケーション サーバー - アプリケーション][分析] の順に移動します。 [分析] を右クリックし、 [ログの有効化] を選択します。

  10. WCF テスト クライアントを使用してサービスをテストします。

    1. WCF テスト クライアントで、ICalculator サービス ノードの下の [Add()] をダブルクリックします。

      Add() メソッドが、2 つのパラメーターと共に右側のウィンドウに表示されます。

    2. 最初のパラメーターに「2」と入力し、2 番目のパラメーターに「3」と入力します。

    3. [呼び出し] をクリックしてメソッドを呼び出します。

  11. 既に開いている [イベント ビューアー] ウィンドウに移動します。 [イベント ビューアー][アプリケーションとサービス ログ][Microsoft][Windows][アプリケーション サーバー - アプリケーション] の順に移動します。

  12. [分析] ノードを右クリックし、 [最新の情報に更新] を選択します。

    右ペインにイベントが表示されます。

  13. ID が 303 のイベントを探してダブルクリックして開き、内容を確認します。

    このイベントは、ICalculator サービスの Add() メソッドによって生成されたもので、ペイロードは "2+3=5" になります。

クリーンアップするには (省略可能)

  1. イベント ビューアーを開きます。

  2. [イベント ビューアー][アプリケーションとサービス ログ][Microsoft][Windows][アプリケーション サーバー - アプリケーション] の順に移動します。 [分析] を右クリックし、 [ログの無効化] を選択します。

  3. [イベント ビューアー][アプリケーションとサービス ログ][Microsoft][Windows][アプリケーション サーバー - アプリケーション][分析] の順に移動します。 [分析] を右クリックし、 [ログのクリア] を選択します。

  4. [クリア] をクリックしてイベントをクリアします。

既知の問題

イベント ビューアーの既知の問題により、ETW イベントをデコードできない場合があります。 その場合、次のようなエラー メッセージが表示されます。「ソース "Microsoft-Windows-Application Server-Applications" からのイベント ID <id> の説明が見つかりません。 このイベントを発生させるコンポーネントがローカル コンピューターにインストールされていないか、インストールが壊れています。 ローカル コンピューターにコンポーネントをインストールするか、コンポーネントを修復してください」。このエラーが発生した場合は、[操作] メニューの [最新の情報に更新] をクリックしてください。 これにより、イベントが正常にデコードされます。

関連項目