Uncategorized

[IT Pro 道場補足] WorkflowServiceHost からイベント ログ (Event Log) を出力する

IT Pro 道場 (東京) 補足

では、つぎに、ワークフローサービスホスト (WES) からイベントログを出力する方法について記載します。

エッセンスは変わりません。ここから読まれている方は、前回の「WCF サービスからイベントログを出力する方法」を参照してください。リソースファイルをサービスの dll に添付するというところも前回同様です。

しかし、1 つだけ、異なる点があります。
それは、ワークフローサービスホストの場合、WCF サービスのときのように IErrorHandler を実装する手段がないということです。ワークフローサービスホストの場合、WF (Windows Workflow Foundation) にエラーハンドリングのための機構があり、これを利用することができます。
では、以下にそのエラーハンドリングのための手順を記載します。

  1. まず、ワークフローのデザイナーを開き、コンテキストメニューから [エラーハンドラの表示] を選択します。
    エラーハンドリングのためのワークフロー設定画面が表示されます。
  2. 表示される [エラーハンドリング] 用のデザイナーでは、「どの例外に対してどのような処理を作成するか」を複数設定できます。
    今回は、もっとも簡単に、「System.Exception (すべての例外) を対象に、イベントログに出力する」といった処理を作っていきます。
    まず、ツールボックスから [FaultHandler] アクティビティをドラッグアンドドロップし、[FaultHandler] アクティビティの下段に [Code] アクティビティをドラッグアンドドロップします。
  3. つぎに、デザイナー上部の「!」を選択し、右下のプロパティウィンドウの [FaultType] で 「System.Exception」 を選択します。
  4. つぎに、デザイナー上部の「!」を右クリックし、[バインド可能なプロパティの昇格] を選択します。
    これにより、faultHandlerActivity1_Fault1 などの名前で、Falut の情報の入れ物が自動作成されます。
  5. 最後に、上記で入れた [FaultHandler] アクティビティの下段に [Code] アクティビティをダブルクリックし、エラーハンドリングのコードとして以下のように記載します。
    private void codeActivity1_ExecuteCode(object sender, EventArgs e){// イベントログの出力!System.Diagnostics.Eventing.EventDescriptor evtDesc = new System.Diagnostics.Eventing.EventDescriptor(1, 0, 0, 2, 0, 0, 0);System.Diagnostics.Eventing.EventProvider evtProvider = new System.Diagnostics.Eventing.EventProvider(new Guid("{0296F16A-11E1-4e3d-8E37-CB8A50715677}"));evtProvider.WriteEvent(ref evtDesc, faultHandlerActivity1_Fault1.Source, faultHandlerActivity1_Fault1.Message); }

以上で完了です!

また、余談ですが、以下のようにホストプログラム上で WorkflowRuntime を取得して例外を処理する方法もありますが、この方法は、ホストプログラム側で処理してしまうというデメリットと (毎回、ホストが変わるたびに処理を記述する必要があります)、WAS などを使った場合には面倒な手続きが必要になりますのであまりお奨めはしません。(WAS の場合には、Factory を自作して、この自作の Factory のクラスの中でイベントログへの出力処理を実施します。)

WorkflowServiceHost workflowHost = new WorkflowServiceHost(typeof(Microsoft.WorkflowServices.Samples.SequentialCalculatorService));workflowHost.Description.Behaviors.Find<WorkflowRuntimeBehavior>().WorkflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e){// この中でイベントログに出力System.Diagnostics.Eventing.EventDescriptor evtDesc = new System.Diagnostics.Eventing.EventDescriptor(1, 0, 0, 2, 0, 0, 0);System.Diagnostics.Eventing.EventProvider evtProvider = new System.Diagnostics.Eventing.EventProvider(new Guid("{0296F16A-11E1-4e3d-8E37-CB8A50715677}"));evtProvider.WriteEvent(ref evtDesc, e.Exception.Source, e.Exception.Message); };

またもう1つ余談ですが、WF では、ロングトランザクションに対応して、補正トランザクションという仕組みを実装できるようになっています。例えば、データベースに行を追加し、ファイルを作成し、その後でエラーが発生した場合、ファイルを消して、行を消して、といった戻りの処理を実装しやすくするための機構を持っており、現実での開発では、こうした仕組みと併用することもあることでしょう。

2008/01/23 追記: こちらに ETW の仕組み、リスナーを使ったモデルなども含め統合的に記述しました -> ETWへのご招待

 

Categories: Uncategorized

Tagged as:

9 replies»

  1. �����ᤰ�� ���ߥ̡��� �����������ᤰ�� ���ߥ̡��� �����ᤰ�� ���ߥ̡��� �����������ᤰ�� ���ߥ̡��ɾ����ᤰ�� ���ߥ̡��� �����������ᤰ�� ���ߥ̡��� �����ᤰ�� ���ߥ̡��� �����������ᤰ�� ���ߥ̡��� �����ᤰ�� ���ߥ̡��� �����������ᤰ�� ���ߥ̡��� ���夬�Ԥä��꿼������������ޥ??����������� �Dz�֥ޥ�å���??פ˼�龮���ᤰ�ߤ��Dz�֥

    Like

  2. こんにちは。 IT Pro 道場「アプリケーションプラットフォーム編」にご参加いただき、ありがとうございました。 と共に、いきなりアプリが動かず、以降のデモのいっさいをお見せすることができなくなってしまい申し訳ございませんでした。

    Like