次の方法で共有


コンテキスト交換プロトコル

このセクションでは、Windows Communication Foundation (WCF) リリース .NET Framework バージョン 3.5 で導入されたコンテキスト交換プロトコルについて説明します。 このプロトコルを使用すると、クライアント チャネルはサービスによって提供されるコンテキストを受け入れ、同じクライアント チャネル インスタンス経由で送信されたそのサービスに対する後続のすべての要求に適用できます。 コンテキスト交換プロトコルの実装では、次の 2 つのメカニズムのいずれかを使用して、サーバーとクライアントの間でコンテキストを伝達できます。HTTP Cookie または SOAP ヘッダー。

コンテキスト交換プロトコルは、カスタム チャネル レイヤーに実装されます。 チャネルは、 ContextMessageProperty プロパティを使用して、アプリケーション レイヤーとの間でコンテキストを通信します。 エンドポイント間の転送の場合、コンテキストの値は、チャネル 層の SOAP ヘッダーとしてシリアル化されるか、HTTP 要求と応答を表すメッセージ プロパティとの間で変換されます。 後者の場合、基になるチャネル レイヤーの 1 つが、HTTP 要求と応答メッセージのプロパティを HTTP Cookie との間でそれぞれ変換することが期待されます。 コンテキストの交換に使用されるメカニズムの選択は、ContextBindingElementContextExchangeMechanism プロパティを使用して行われます。 有効な値は HttpCookie または SoapHeaderです。

クライアントでは、チャネルのインスタンスは、チャネル プロパティの設定に基づいて、 Enabled 2 つのモードで動作できます。

モード 1: チャネル コンテキスト管理

これは、 Enabledtrueに設定されている既定のモードです。 このモードでは、コンテキスト チャネルはコンテキストを管理し、その有効期間中にコンテキストをキャッシュします。 GetContext メソッドを呼び出すことによって、チャネル プロパティIContextManagerを介してチャネルからコンテキストを取得できます。 チャネルプロパティで SetContext メソッドを呼び出すことで、チャネルを開く前に特定のコンテキストで事前初期化することもできます。 チャネルがコンテキストで初期化されると、リセットできません。

このモードのインバリアントの一覧を次に示します。

  • チャネルが開かれた後に SetContext を使用してコンテキストをリセットしようとすると、 InvalidOperationExceptionがスローされます。

  • 送信メッセージで ContextMessageProperty を使用してコンテキストを送信しようとすると、 InvalidOperationExceptionがスローされます。

  • 特定のコンテキストを持つサーバーからメッセージを受信した場合、チャネルが特定のコンテキストで既に初期化されていると、 ProtocolExceptionが発生します。

    コンテキストが明示的に設定されずにチャネルが開かれている場合にのみ、サーバーから初期コンテキストを受け取るのが適切です。

  • 受信メッセージの ContextMessageProperty は常に null です。

モード 2: アプリケーション コンテキスト管理

これは、 Enabledfalse に設定されている場合のモードです。 このモードでは、コンテキスト チャネルはコンテキストを管理しません。 ContextMessagePropertyを使用してコンテキストを取得、管理、適用するのはアプリケーションの責任です。 GetContextまたはSetContextを呼び出そうとすると、InvalidOperationExceptionが発生します。

どのモードが選択されても、クライアント チャネル ファクトリはメッセージ交換パターン IRequestChannelIRequestSessionChannel、および IDuplexSessionChannel をサポートします。

サービスでは、チャネルのインスタンスは、受信メッセージでクライアントによって提供されるコンテキストを ContextMessagePropertyに変換する役割を担います。 その後、メッセージ プロパティには、呼び出し履歴内のアプリケーション 層またはその他のチャネルからアクセスできます。 また、サービス チャネルでは、応答メッセージに ContextMessageProperty をアタッチして、クライアントに反映される新しいコンテキスト値をアプリケーション レイヤーで指定することもできます。 このプロパティは、バインディングの構成に依存するコンテキストを含む SOAP ヘッダーまたは HTTP Cookie に変換されます。 サービス チャネル リスナーは、メッセージ交換パターンの IReplyChannelIReplySessionChannel、および IReplySessionChannel をサポートします。

コンテキスト交換プロトコルでは、HTTP Cookie を使用してコンテキストを伝達しない場合にコンテキスト情報を表す新しい wsc:Context SOAP ヘッダーが導入されます。 コンテキスト ヘッダー スキーマでは、任意の数の子要素を使用でき、それぞれに文字列キーと文字列の内容が含まれます。 コンテキスト ヘッダーの例を次に示します。

<Context xmlns="http://schemas.microsoft.com/ws/2006/05/context">

<property name="myContext">context-2</property>

</Context>

HttpCookie モードの場合、cookie は SetCookie ヘッダーを使用して設定されます。 Cookie 名は WscContext。 Cookie の値は、 wsc:Context ヘッダーの Base64 エンコードです。 この値は引用符で囲まれています。

コンテキストの値は、転送中にヘッダーが保護されるのと同じ理由 WS-Addressing 変更から保護する必要があります。ヘッダーは、サービスに要求をディスパッチする場所を決定するために使用されます。 したがって、バインドがメッセージ保護機能を提供する場合、 wsc:Context ヘッダーは、SOAP レベルまたはトランスポート レベルでデジタル署名または署名および暗号化する必要があります。 HTTP Cookie を使用してコンテキストを伝達する場合は、トランスポート セキュリティを使用して保護する必要があります。

コンテキスト交換プロトコルのサポートを必要とするサービス エンドポイントは、公開されたポリシーで明示的にすることができます。 クライアントが SOAP レベルでコンテキスト交換プロトコルをサポートするか、HTTP Cookie のサポートを有効にするための要件を表す 2 つの新しいポリシー アサーションが導入されました。 サービスのポリシーへのこれらのアサーションの生成は、次のように ContextExchangeMechanism プロパティの値によって制御されます。

  • ContextSoapHeaderの場合、次のアサーションが生成されます。

    <IncludeContext
    xmlns="http://schemas.microsoft.com/ws/2006/05/context"  
    protectionLevel="Sign" />  
    
  • HttpCookieの場合、次のアサーションが生成されます。

    <HttpUseCookie xmlns="http://schemas.xmlsoap.org/soap/http"/>  
    

こちらも参照ください