WCFAnalyticTracingExtensibility サンプルでは、Windows Communication Foundation (WCF) が .NET Framework の ETW に書き込む分析トレースのストリームに独自のトレース イベントを追加する方法を示します。 分析トレースは、高パフォーマンスのペナルティを支払うことなく、サービスを簡単に可視化することを目的としています。 このサンプルでは、 System.Diagnostics.Eventing API を使用して、WCF サービスと統合されるイベントを記述する方法を示します。
System.Diagnostics.Eventing API の詳細については、「System.Diagnostics.Eventing」を参照してください。
Windows でのイベント トレースの詳細については、「 ETW を使用したデバッグとパフォーマンスチューニングの向上」を参照してください。
EventProvider の破棄
このサンプルでは、System.IDisposableを実装する System.Diagnostics.Eventing.EventProvider クラスを使用します。 WCF サービスのトレースを実装する場合、サービスの有効期間中に EventProviderのリソースを使用する可能性があります。 このため、読みやすくするために、このサンプルはラップされた EventProviderを破棄しません。 何らかの理由でサービスにトレースの要件が異なり、このリソースを破棄する必要がある場合は、アンマネージド リソースを破棄するためのベスト プラクティスに従ってこのサンプルを変更する必要があります。 アンマネージ リソースの破棄の詳細については、「 Dispose メソッドの実装」を参照してください。
Self-Hosting とWebホスティング
Web ホスト型サービスの場合、WCF の分析トレースには"HostReference" というフィールドが用意されています。これは、トレースを出力するサービスを識別するために使用されます。 拡張可能なユーザー トレースは、このモデルに参加できます。このサンプルでは、これを行うためのベスト プラクティスを示します。 結果の文字列にパイプ '|' 文字が実際に表示される場合の Web ホスト参照の形式は、次のいずれかになります。
アプリケーションがルートにない場合。
<SiteName><ApplicationVirtualPath>|<ServiceVirtualPath>|<ServiceName>
アプリケーションがルートにある場合。
<SiteName>|<ServiceVirtualPath>|<ServiceName>
セルフホステッド サービスの場合、WCF の分析トレースは "HostReference" フィールドを設定しません。 このサンプルの WCFUserEventProvider
クラスは、セルフホステッド サービスで使用される場合に一貫して動作します。
カスタム イベントの詳細
WCF の ETW イベント プロバイダー マニフェストは、WCF サービス作成者がサービス コード内から出力するように設計された 3 つのイベントを定義します。 次の表は、3 つのイベントの内訳を示しています。
出来事 | 説明 | イベント ID |
---|---|---|
UserDefinedInformationEventOccurred | このイベントは、サービスで問題のない注意事項が発生したときに生成されます。 たとえば、データベースの呼び出しに成功した後にイベントを生成できます。 | 301 |
UserDefinedWarningOccurred | 今後エラーが発生する可能性のある問題が発生した場合に、このイベントを生成します。 たとえば、データベースの呼び出しが失敗したが、冗長なデータ ストアにフォールバックして復旧できた場合に、警告イベントを生成できます。 | 302 |
UserDefinedErrorOccurred | サービスが期待どおりに動作しない場合に、このイベントを出力します。 たとえば、データベースの呼び出しが失敗し、他の場所からデータを取得できなかった場合にイベントを生成できます。 | 303 |
このサンプルを使用するには
Visual Studio を使用して、WCFAnalyticTracingExtensibility.sln ソリューション ファイルを開きます。
ソリューションをビルドするには、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、Application Server-Applications の順に移動します。 [Application Server-Applications] を右クリックし、[表示] を選択し、[分析ログとデバッグ ログの表示] を選択します。
[ 分析ログとデバッグ ログの表示 ] オプションがオンになっていることを確認します。 分析ログを有効にします。
イベント ビューアーのツリー ビューで、 イベント ビューアー、 アプリケーションとサービス ログ、 Microsoft、 Windows、 Application Server-Applications、 Analytic に移動します。 [分析] を右クリックし、 [ログの有効化] を選択します。
WCF テスト クライアントを使用してサービスをテストします。
WCF テスト クライアントで、ICalculator サービス ノードの下にある Add() をダブルクリックします。
Add() メソッドは、2 つのパラメーターを持つ右側のウィンドウに表示されます。
最初のパラメーターには 2、2 番目のパラメーターには 3 を入力します。
[ 呼び出し ] をクリックしてメソッドを呼び出します。
既に開いている イベント ビューアー ウィンドウに移動します。 イベント ビューアー、アプリケーション、サービス ログ、Microsoft、Windows、Application Server-Applications に移動します。
[分析] ノードを右クリックし、[最新の情報に更新] を選択します。
イベントが右側のウィンドウに表示されます。
ID が 303 のイベントを見つけてダブルクリックして開き、その内容を調べます。
このイベントは、ICalculator サービスの
Add()
メソッドによって生成され、ペイロードは "2+3=5" になります。
クリーンアップするには (省略可能)
イベント ビューアーを開きます。
イベント ビューアー、アプリケーションとサービス ログ、Microsoft、Windows、Application-Server-Applications の順に移動します。 [分析] を右クリックし、[ログの無効化] を選択します。
イベント ビューアー、アプリケーションとサービス ログ、Microsoft、Windows、Application-Server-Applications、Analytic に移動します。 [分析] を右クリックし、[ログのクリア] を選択します。
[ クリア ] をクリックしてイベントをクリアします。
既知の問題
イベント ビューアーには、ETW イベントのデコードに失敗する可能性がある既知の問題があります。 "ソース Microsoft からのイベント ID <id> の説明が見つかりませんWindows-Application Server-Applications というエラー メッセージが表示される場合があります。 このイベントを発生させるコンポーネントがローカル コンピューターにインストールされていないか、インストールが壊れています。 ローカル コンピューターにコンポーネントをインストールまたは修復できます。このエラーが発生した場合は、[アクション] メニューから [更新] を選択します。 その後、イベントは正しくデコードされます。