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 |
このサンプルを使用するには
Visual Studio を使用して、WCFAnalyticTracingExtensibility.sln ソリューション ファイルを開きます。
ソリューションをビルドするには、Ctrl+Shift+B キーを押します。
ソリューションを実行するには、Ctrl キーを押しながら F5 キーを押します。
Web ブラウザーで、 [Calculator.svc] をクリックします。 サービスの WSDL ドキュメントの URI がブラウザーに表示されます。 その URI をコピーします。
WCF テスト クライアント (WcfTestClient.exe) を実行します。
WCF テスト クライアント (WcfTestClient.exe) は
\<Visual Studio Install Dir>\Common7\IDE\WcfTestClient.exe
にあります。WCF テスト クライアントで、 [ファイル] 、 [サービスの追加] の順に選択して、サービスを追加します。
入力ボックスにエンドポイントのアドレスを追加します。
[OK] をクリックしてダイアログ ボックスを閉じます。
ICalculator サービスが、左側のウィンドウの [マイ サービス プロジェクト] の下に追加されます。
イベント ビューアー アプリケーションを開きます。
サービスを呼び出す前に、イベント ビューアーを起動し、WCF サービスから生成された追跡イベントをイベント ログでリッスンしていることを確認します。
[スタート] ボタンをクリックし、 [管理ツール] をポイントしてから [イベント ビューアー] をクリックします。 [分析] および [デバッグ] ログを有効にします。
イベント ビューアーのツリー ビューで、 [イベント ビューアー] 、 [アプリケーションとサービス ログ] 、 [Microsoft] 、 [Windows] 、 [アプリケーション サーバー - アプリケーション] の順に移動します。 [アプリケーション サーバー - アプリケーション] を右クリックし、 [表示] 、 [分析およびデバッグ ログの表示] の順に選択します。
[分析およびデバッグ ログの表示] オプションがオンになっていることを確認します。 [分析] ログを有効にします。
イベント ビューアーのツリー ビューで、 [イベント ビューアー] 、 [アプリケーションとサービス ログ] 、 [Microsoft] 、 [Windows] 、 [アプリケーション サーバー - アプリケーション] 、 [分析] の順に移動します。 [分析] を右クリックし、 [ログの有効化] を選択します。
WCF テスト クライアントを使用してサービスをテストします。
WCF テスト クライアントで、ICalculator サービス ノードの下の [Add()] をダブルクリックします。
Add() メソッドが、2 つのパラメーターと共に右側のウィンドウに表示されます。
最初のパラメーターに「2」と入力し、2 番目のパラメーターに「3」と入力します。
[呼び出し] をクリックしてメソッドを呼び出します。
既に開いている [イベント ビューアー] ウィンドウに移動します。 [イベント ビューアー] 、 [アプリケーションとサービス ログ] 、 [Microsoft] 、 [Windows] 、 [アプリケーション サーバー - アプリケーション] の順に移動します。
[分析] ノードを右クリックし、 [最新の情報に更新] を選択します。
右ペインにイベントが表示されます。
ID が 303 のイベントを探してダブルクリックして開き、内容を確認します。
このイベントは、ICalculator サービスの
Add()
メソッドによって生成されたもので、ペイロードは "2+3=5" になります。
クリーンアップするには (省略可能)
イベント ビューアーを開きます。
[イベント ビューアー] 、 [アプリケーションとサービス ログ] 、 [Microsoft] 、 [Windows] 、 [アプリケーション サーバー - アプリケーション] の順に移動します。 [分析] を右クリックし、 [ログの無効化] を選択します。
[イベント ビューアー] 、 [アプリケーションとサービス ログ] 、 [Microsoft] 、 [Windows] 、 [アプリケーション サーバー - アプリケーション] 、 [分析] の順に移動します。 [分析] を右クリックし、 [ログのクリア] を選択します。
[クリア] をクリックしてイベントをクリアします。
既知の問題
イベント ビューアーの既知の問題により、ETW イベントをデコードできない場合があります。 その場合、次のようなエラー メッセージが表示されます。「ソース "Microsoft-Windows-Application Server-Applications" からのイベント ID <id> の説明が見つかりません。 このイベントを発生させるコンポーネントがローカル コンピューターにインストールされていないか、インストールが壊れています。 ローカル コンピューターにコンポーネントをインストールするか、コンポーネントを修復してください」。このエラーが発生した場合は、[操作] メニューの [最新の情報に更新] をクリックしてください。 これにより、イベントが正常にデコードされます。