WCF インターセプト用に BAM を構成するには、イベント ソースの適切なアセンブリ マニフェストにアクセスするようにインターセプター構成ファイルを変更する必要があります。
イベントを構成するときは、アクションに適切に書式設定された XPath 式を指定する必要があります。
WCF トレースを有効にし、アプリケーションを実行してメッセージを含むサンプル WCF ログを生成することで、インターセプター構成で使用する適切な形式の XPath 式を作成できます。 Microsoft サービス トレース ビューアー (SvcTraceViewer.exe) を使用してログを表示し、メッセージを抽出できます。 ビューアーは WCF SDK に含まれています。 その後、メッセージに基づいて目的の XPath 式を形成し、インターセプター構成に適用できます。
BAM WCF インターセプトを構成するときは、machine.config ファイルで使用される動作拡張機能が、受信場所のカスタム動作構成で使用される拡張機能と一致することが不可欠です。 machine.config ファイルで構成されている受信場所の拡張機能名を変更すると、動作の読み込みに失敗します。 さらに、受信場所の構成 UI は失敗します。
クラスター化されたシナリオの場合、カスタム動作は 1 回だけ構成されるため、クラスター内のコンピューター上のすべての machine.config ファイルで同じファイル名拡張子が指定されていることを確認する必要があります。
マニフェストを設定するには
インターセプト構成の EventSource のマニフェストを 'Microsoft.BizTalk.Adapter.Wcf.Runtime.ITwoWayAsyncVoid, Microsoft.BizTalk.Adapter.Wcf.Runtime, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' に設定します。
注
インターフェイスは、使用されるサービス/受信ポートの種類に基づいて変更されます。 次の表に従って、使用しているポートの種類を反映するようにマニフェスト行を変更します。
ポートの種類 用途 双方向ポート ITwoWayAsync 本質的に 2 つの 2 方向 (HTTP など) であるバインディングを持つ一方向ポート。 ITwoWayAsyncVoid 取引を伴う場合に、本質的に二方向性を兼ね備えた一方向ポート。 ITwoWayAsyncVoidTxn 一方向のバインド (MSMQ など)。 IOneWayAsync トランザクションの 1 つの方法であるバインディング。 IOneWayAsyncTxn Von Bedeutung
フィルターでは、 GetOperationName 操作を使用する代わりに、次のサンプルで強調表示されている XPath 操作を使用します。 ジェネリック コントラクトの場合、すべてのメッセージは一般的な操作に到達し、その時点でメッセージ自体 (Action 属性) に基づいて特定の操作にルーティングされます。
この時点では、操作名は常に同じになります。 WCF アダプター (汎用コントラクトを使用) の場合、使用されるメソッドは BizTalkSubmit です。 操作名を取得するには、GetOperationName の代わりにアクション ノードに XPath を使用できます。 その後、操作名をフィルター処理できます。
インターセプター構成の例
このサンプルでは、WCF アダプターの ServiceRequest と ServiceReply の使用方法を示します。 強調表示されたセクションでは、GetOperationName を使用する代わりに、アクションの XPath 式を使用して操作をフィルター処理します。 応答をフィルター処理することもできますが、ITwoWayAsync の場合にのみ使用できます。 他のすべてのインターフェイスは何も返しません。void も返しません。
サービスリクエスト
<ic:OnEvent IsBegin="true" IsEnd ="false" Name ="WCFServiceRequest" Source="WCFService">
<ic:Filter>
<ic:Expression>
<wcf:Operation Name="GetServiceContractCallPoint"/>
<ic:Operation Name ="Constant">
<ic:Argument>ServiceRequest</ic:Argument>
</ic:Operation>
<ic:Operation Name ="Equals" />
<wcf:Operation Name ="XPath">
<wcf:Argument>//s:Header/a:Action</wcf:Argument>
</wcf:Operation>
<ic:Operation Name ="Constant">
<ic:Argument>Operation1</ic:Argument>
</ic:Operation>
<ic:Operation Name ="Equals" />
<ic:Operation Name ="And" />
</ic:Expression>
</ic:Filter>
<ic:CorrelationID>
<ic:Expression>
<wcf:Operation Name="AutoGenerateCorrelationToken"/>
</ic:Expression>
</ic:CorrelationID>
<ic:Update DataItemName ="Activity Date" Type ="DATETIME">
<ic:Expression>
<wcf:Operation Name ="GetContextProperty">
<wcf:Argument>EventTime</wcf:Argument>
</wcf:Operation>
</ic:Expression>
</ic:Update>
<ic:Update DataItemName ="Source" Type ="NVARCHAR">
<ic:Expression>
<ic:Operation Name="Constant">
<ic:Argument>WcfAdapter_ServiceRequest</ic:Argument>
</ic:Operation>
</ic:Expression>
</ic:Update>
</ic:OnEvent>
ServiceReply
<ic:OnEvent IsBegin="true" IsEnd ="false" Name ="WCFServiceReply" Source="WCFService">
<ic:Filter>
<ic:Expression>
<wcf:Operation Name="GetServiceContractCallPoint"/>
<ic:Operation Name ="Constant">
<ic:Argument>ServiceReply</ic:Argument>
</ic:Operation>
<ic:Operation Name ="Equals" />
</ic:Expression>
</ic:Filter>
<ic:CorrelationID>
<ic:Expression>
<wcf:Operation Name="AutoGenerateCorrelationToken"/>
</ic:Expression>
</ic:CorrelationID>
<ic:Update DataItemName ="Activity Date" Type ="DATETIME">
<ic:Expression>
<wcf:Operation Name ="GetContextProperty">
<wcf:Argument>EventTime</wcf:Argument>
</wcf:Operation>
</ic:Expression>
</ic:Update>
<ic:Update DataItemName ="Name" Type ="NVARCHAR">
<ic:Expression>
<ic:Operation Name="Constant">
<ic:Argument>WcfAdapter_ServiceReply</ic:Argument>
</ic:Operation>
</ic:Expression>
</ic:Update>
</ic:OnEvent>