呼び出し元アプリケーションでは、サービス モデル レイヤーは、アプリケーション コード内のメソッド呼び出しを送信メッセージに変換し、それらを基になるチャネルにプッシュし、結果をアプリケーション コードの戻り値と出力パラメーターに変換し、結果を呼び出し元に返します。 サービス モデル拡張機能は、クライアントまたはディスパッチャーの機能、カスタム動作、メッセージとパラメーターのインターセプト、およびその他の拡張機能を含む実行または通信の動作と機能を変更または実装します。
このトピックでは、Windows Communication Foundation (WCF) クライアント アプリケーションで ClientRuntime クラスと ClientOperation クラスを使用して、WCF クライアントの既定の実行動作を変更したり、チャンネル レイヤーに送信または取得する前後でメッセージ、パラメーター、戻り値を傍受または変更する方法について説明します。 サービス ランタイムの拡張の詳細については、「 ディスパッチャーの拡張」を参照してください。 クライアント ランタイムにカスタマイズ オブジェクトを変更および挿入する動作の詳細については、「ビヘイビアーを使用 したランタイムの構成と拡張」を参照してください。
クライアント
クライアントでは、WCF クライアント オブジェクトまたはクライアント チャネルは、メソッドの呼び出しを送信メッセージに変換し、受信メッセージを呼び出し元のアプリケーションに返される操作の結果に変換します。 (クライアントの種類の詳細については、「 WCF クライアント アーキテクチャ」を参照してください)。
WCF クライアントの種類には、このエンドポイントと操作レベルの機能を処理するランタイム型があります。 アプリケーションが操作を呼び出すと、 ClientOperation は送信オブジェクトをメッセージに変換し、インターセプターを処理し、送信呼び出しがターゲット コントラクトに準拠していることを確認し、送信メッセージを ClientRuntimeに渡します。送信メッセージは、送信チャネル (および双方向サービスの場合は受信チャネル) の作成と管理を担当し、追加の送信メッセージ処理 (ヘッダーの変更など) を処理します。 メッセージ インターセプターを双方向に処理し、受信双方向呼び出しを適切なクライアント側の DispatchRuntime オブジェクトにルーティングします。 メッセージ (エラーを含む) がクライアントに返されるときに、 ClientOperation と ClientRuntime の両方で同様のサービスが提供されます。
これら 2 つのランタイム クラスは、WCF クライアント オブジェクトとチャネルの処理をカスタマイズするための主要な拡張機能です。 ClientRuntime クラスを使用すると、ユーザーはコントラクト内のすべてのメッセージでクライアントの実行をインターセプトして拡張できます。 ClientOperation クラスを使用すると、ユーザーは特定の操作内のすべてのメッセージのクライアント実行をインターセプトして拡張できます。
プロパティの変更またはカスタマイズの挿入は、コントラクト、エンドポイント、および操作の動作を使用して行われます。 これらの種類の動作を使用してクライアント ランタイムのカスタマイズを実行する方法の詳細については、「 ビヘイビアーを使用したランタイムの構成と拡張」を参照してください。
シナリオ
クライアント システムを拡張するには、次のようないくつかの理由があります。
カスタム メッセージの検証。 ユーザーは、メッセージが特定のスキーマに対して有効であることを強制することができます。 これを行うには、 IClientMessageInspector インターフェイスを実装し、 MessageInspectors プロパティに実装を割り当てます。 例については、「 方法: クライアント上のメッセージを検査または変更 する」および「 方法: クライアント上のメッセージを検査または変更する」を参照してください。
カスタムメッセージ記録 ユーザーは、エンドポイントを通過するアプリケーション メッセージのセットを検査してログに記録することができます。 これは、メッセージ インターセプター インターフェイスを使用して実現することもできます。
カスタム メッセージ変換。 ユーザーは、アプリケーション コードを変更するのではなく、ランタイム内のメッセージに特定の変換を適用できます (バージョン管理など)。 これは、メッセージ インターセプター インターフェイスを使用して、再度実現できます。
カスタム データ モデル。 ユーザーは、WCF で既定でサポートされているモデル (つまり、 System.Runtime.Serialization.DataContractSerializer、 System.Xml.Serialization.XmlSerializer、および System.ServiceModel.Channels.Message オブジェクト) 以外のデータまたはシリアル化モデルを使用できます。 これを行うには、メッセージ フォーマッタ インターフェイスを実装します。 詳細については、「 System.ServiceModel.Dispatcher.IClientMessageFormatter と ClientOperation.Formatter プロパティ」を参照してください。
カスタム パラメーターの検証。 ユーザーは、型指定されたパラメーターが (XML ではなく) 有効であることを強制できます。 これは、パラメーターインスペクターインターフェイスを使用して行うことができます。 例については、「方法: パラメーターまたはクライアント検証を検査または変更する」を参照してください。
ClientRuntime クラスの使用
ClientRuntime クラスは、メッセージをインターセプトしてクライアントの動作を拡張する拡張オブジェクトを追加できる拡張ポイントです。 インターセプト オブジェクトは、特定のコントラクト内のすべてのメッセージを処理したり、特定の操作のメッセージのみを処理したり、カスタム チャネルの初期化を実行したり、他のカスタム クライアント アプリケーションの動作を実装したりできます。
CallbackDispatchRuntime プロパティは、サービス開始コールバック クライアントのディスパッチ ランタイム オブジェクトを返します。
OperationSelector プロパティは、カスタム操作セレクター オブジェクトを受け入れます。
ChannelInitializers プロパティを使用すると、クライアント チャネルを検査または変更できるチャネル初期化子を追加できます。
Operations プロパティは、その操作のメッセージに固有の機能を提供するカスタム メッセージ インターセプターを追加できるClientOperation オブジェクトのコレクションを取得します。
ManualAddressing プロパティを使用すると、アプリケーションで自動アドレス指定ヘッダーをオフにして、アドレス指定を直接制御できます。
Via プロパティは、仲介者やその他のシナリオをサポートするために、トランスポート レベルでメッセージの送信先の値を設定します。
MessageInspectors プロパティは、WCF クライアントを経由するすべてのメッセージのカスタム メッセージ インターセプターを追加できるIClientMessageInspector オブジェクトのコレクションを取得します。
さらに、コントラクト情報を取得するプロパティは他にも多数あります。
WCF クライアントが双方向 WCF クライアントの場合、次のプロパティはコールバック WCF クライアント情報も取得します。
WCF クライアント全体で WCF クライアントの実行を拡張するには、 ClientRuntime クラスで使用できるプロパティを確認して、プロパティを変更するか、インターフェイスを実装してプロパティに追加しても、探している機能が作成されるかどうかを確認します。 ビルドする特定の拡張機能を選択したら、呼び出されたときにClientRuntime クラスへのアクセスを提供するクライアント動作を実装して、適切なClientRuntime プロパティに拡張機能を挿入します。
操作動作 ( IOperationBehaviorを実装するオブジェクト)、コントラクト動作 ( IContractBehaviorを実装するオブジェクト)、またはエンドポイント動作 ( IEndpointBehaviorを実装するオブジェクト) を使用して、カスタム拡張オブジェクトをコレクションに挿入できます。 インストール動作オブジェクトは、プログラムによって、宣言によって (カスタム属性を実装することによって)、またはカスタム BehaviorExtensionElement オブジェクトを実装して、アプリケーション構成ファイルを使用して動作を挿入できるように、動作の適切なコレクションに追加されます。 詳細については、「 ビヘイビアーを使用したランタイムの構成と拡張」を参照してください。
WCF クライアント間のインターセプトを示す例については、「 方法: クライアントでメッセージを検査または変更する」を参照してください。
ClientOperation クラスの使用
ClientOperation クラスは、1 つのサービス操作のみを対象とするカスタム拡張機能のクライアントランタイム変更と挿入ポイントの場所です。 (コントラクト内のすべてのメッセージのクライアント ランタイム動作を変更するには、 ClientRuntime クラスを使用します)。
Operations プロパティを使用して、特定のサービス操作を表すClientOperation オブジェクトを見つけます。 次のプロパティを使用すると、WCF クライアント システムにカスタム オブジェクトを挿入できます。
Formatter プロパティを使用して、操作のカスタム IClientMessageFormatter実装を挿入するか、現在のフォーマッタを変更します。
カスタム ParameterInspectors実装を挿入したり、現在の実装を変更したりするには、IParameterInspector プロパティを使用します。
次のプロパティを使用すると、フォーマッタとカスタム パラメーター インスペクターとの対話でシステムを変更できます。
送信メッセージのシリアル化を制御するには、 SerializeRequest プロパティを使用します。
受信メッセージの逆シリアル化を制御するには、 DeserializeReply プロパティを使用します。
Action プロパティを使用して、要求メッセージの WS-Addressing アクションを制御します。
BeginMethodとEndMethodを使用して、非同期操作に関連付けられている WCF クライアント メソッドを指定します。
FaultContractInfos プロパティを使用して、詳細型として SOAP エラーに出現する可能性がある型を含むコレクションを取得します。
IsInitiatingプロパティとIsTerminating プロパティを使用して、操作の呼び出し時にセッションを開始するか、または切断するかを制御します。
操作が一方向の操作であるかどうかを制御するには、 IsOneWay プロパティを使用します。
Parent プロパティを使用して、含まれるClientRuntime オブジェクトを取得します。
操作の名前を取得するには、 Name プロパティを使用します。
SyncMethod プロパティを使用して、操作にマップされるメソッドを制御します。
WCF クライアントの実行を 1 つのサービス操作のみに拡張するには、 ClientOperation クラスで使用できるプロパティを確認して、プロパティを変更するか、インターフェイスを実装してプロパティに追加しても、探している機能が作成されるかどうかを確認します。 ビルドする特定の拡張機能を選択したら、呼び出されたときにClientOperation クラスへのアクセスを提供するクライアント動作を実装して、適切なClientOperation プロパティに拡張機能を挿入します。 その動作内で、要件に合わせて ClientRuntime プロパティを変更できます。
通常、操作の動作 ( IOperationBehavior インターフェイスを実装するオブジェクト) を実装するだけで十分ですが、エンドポイントの動作とコントラクトの動作を使用して、特定の操作の OperationDescription を検索し、そこに動作をアタッチすることで、同じことを実現することもできます。 詳細については、「 ビヘイビアーを使用したランタイムの構成と拡張」を参照してください。
構成からカスタム動作を使用するには、カスタム動作構成セクション ハンドラーを使用して動作をインストールします。 カスタム属性を作成して動作をインストールすることもできます。
WCF クライアント間のインターセプトを示す例については、「 方法: パラメーターを検査または変更する」を参照してください。