Windows Communication Foundation (WCF) SOAP Reliable Messaging は、SOAP エンドポイント間のエンド ツー エンドのメッセージ転送の信頼性を提供します。 これは、トランスポート エラーと SOAP メッセージ レベルのエラーを克服することによって信頼性の低いネットワークで行われます。 特に、SOAP またはトランスポート中継局間で送信されるメッセージに対して、セッション ベース、単一、および (必要に応じて) 順序付けされた配信を提供します。 セッション ベースの配信では、メッセージの順序をオプションで指定して、セッション内のメッセージをグループ化できます。
このトピックでは、信頼できるセッション、それらを使用する方法とタイミング、およびそれらをセキュリティで保護する方法について説明します。
WCF の信頼できるセッション
WCF リライアブル セッションは、WS-ReliableMessaging プロトコルで定義されている SOAP リライアブル メッセージングの実装です。
WCF SOAP Reliable Messaging は、メッセージング エンドポイントを分離する中継局の数や種類に関係なく、2 つのエンドポイント間でエンドツーエンドの信頼できるセッションを提供します。 これには、SOAP を使用しないトランスポート中継局 (HTTP プロキシなど) や、メッセージがエンドポイント間を流れるのに必要な SOAP (SOAP ベースのルーターやブリッジなど) を使用する中継局が含まれます。 信頼できるセッション チャネルは 対話型 通信をサポートしているため、このようなチャネルによって接続されたサービスが同時に実行され、待機時間が短い条件下で、つまり比較的短い間隔でメッセージを交換および処理できます。 この結合は、これらのコンポーネントが一緒に進行するか、一緒に失敗することを意味するため、それらの間に分離が提供されません。
信頼できるセッションでは、次の 2 種類のエラーがマスクされます。
SOAP メッセージ レベルのエラー。失われた、または重複したメッセージや、送信された順序とは異なる順序で到着したメッセージが含まれます。
トランスポートエラー。
信頼できるセッションでは、WS-ReliableMessaging プロトコルとメモリ内転送ウィンドウが実装され、SOAP メッセージ レベルのエラーがマスクされ、トランスポートエラーが発生した場合に接続が再確立されます。
信頼できるセッションは、TCP が IP パケットに対して提供する SOAP メッセージを提供します。 TCP ソケット接続では、ノード間での IP パケットの単一の順の転送が提供されます。 信頼できるチャネルは、同じ種類の信頼性の高い転送を提供しますが、TCP ソケットの信頼性とは次の点で異なります。
信頼性は SOAP メッセージ レベルであり、任意のサイズのバイト パケットではありません。
信頼性は、TCP 経由での転送だけでなく、トランスポートに依存しません。
信頼性は特定のトランスポート セッション (TCP 接続が提供するセッションなど) に関連付けられず、信頼できるセッションの有効期間中に複数のトランスポート セッションを同時または順番に使用できます。
信頼できるセッションは、それらの間の接続に必要なトランスポート接続の数に関係なく、送信側と受信側の SOAP エンドポイントの間にあります。 つまり、TCP の信頼性はトランスポート接続が終了する場所で終了しますが、信頼できるセッションはエンドツーエンドの信頼性を提供します。
信頼できるセッションとバインディング
前述のように、信頼できるセッションはトランスポートニュートラルです。 また、要求/応答や双方向など、多くのメッセージ交換パターンで信頼できるセッションを確立することもできます。 WCF の信頼できるセッションは、一連のバインディングに対するプロパティの 1 つとして公開されています。
次を使用するエンドポイントで信頼できるセッションを使用します。
HTTP ベースのトランスポート標準バインディング:
WsHttpBinding
要求/応答または一方向のコントラクトを公開します。要求/応答または単純な一方向サービス コントラクトで信頼できるセッションを使用する場合。
WsDualHttpBinding
双方向、要求/応答、一方向いずれかのコントラクトを公開します。WsFederationHttpBinding
要求/応答または一方向のコントラクトを公開します。
TCP ベースのトランスポート標準バインディング:
NetTcpBinding
双方向、要求/応答、一方向いずれかのコントラクトを公開します。
HTTPS などのカスタム バインド (問題の詳細については、信頼できるセッションとセキュリティを参照) や名前付きパイプ バインドを作成して、他のバインディングで 信頼できるセッションを使用します。
基になるチャネルの種類ごとに信頼できるセッションをスタックでき、結果として得られる信頼できるセッション チャネルの形状は異なります。 クライアントとサーバーの両方で、サポートされる信頼できるセッション チャネルの種類は、使用される基になるチャネルの種類によって異なります。 次の表に、基になるチャネルの種類の関数としてクライアントでサポートされるセッション チャネルの種類を示します。
サポートされている信頼できるセッション チャネルの種類† | IRequestChannel |
IRequestSessionChannel |
IDuplexChannel |
IDuplexSessionChannel |
---|---|---|---|---|
IOutputSessionChannel |
イエス | イエス | イエス | イエス |
IRequestSessionChannel |
イエス | イエス | いいえ | いいえ |
IDuplexSessionChannel |
いいえ | いいえ | イエス | イエス |
†サポートされているチャネルの種類は、TChannel
メソッドに渡されるジェネリック BuildChannelFactory<TChannel>(BindingContext) パラメーター値に使用できる値です。
次の表に、基になるチャネルの種類の関数としてサーバーでサポートされるセッション チャネルの種類を示します。
サポートされている信頼できるセッション チャネルの種類‡ | IReplyChannel |
IReplySessionChannel |
IDuplexChannel |
IDuplexSessionChannel |
---|---|---|---|---|
IInputSessionChannel |
イエス | イエス | イエス | イエス |
IReplySessionChannel |
イエス | イエス | いいえ | いいえ |
IDuplexSessionChannel |
いいえ | いいえ | イエス | イエス |
‡サポートされているチャネルの種類は、TChannel
メソッドに渡されるジェネリック BuildChannelListener<TChannel>(BindingContext) パラメーター値に使用できる値です。
信頼できるセッションとセキュリティ
信頼できるセッションのセキュリティ保護は、通信相手 (サービスとクライアント) が認証され、セッションで交換されたメッセージが改ざんされないようにするために重要です。 さらに、個々の信頼できるセッションの整合性を確保することが重要です。 信頼できるセッションは、セキュリティ セッション チャネルによって表され、管理されるセキュリティ コンテキストにバインドすることによってセキュリティで保護されます。 セキュリティ チャネルは、セキュリティ セッションを提供します。 セッションの確立中に交換されたセキュリティ トークンは、信頼できるセッション内のメッセージをセキュリティで保護するために使用されます。
信頼できるセッションが TCP-S 経由の場合、TCP セッションは信頼できるセッションに関連付けられます。 そのため、トランスポート セキュリティにより、セキュリティも信頼できるセッションに関連付けられます。 この場合、接続の再確立はオフになります。
唯一の例外は、HTTPS を使用する場合です。 Secure Sockets Layer (SSL) セッションは、信頼できるセッションにバインドされていません。 セキュリティ コンテキスト (SSL セッション) を共有しているセッションは互いに保護されていないため、脅威が発生します。これは、アプリケーションによっては実際の脅威になる可能性があります。そうでない場合もあります。
信頼できるセッションの使用
WCF の信頼できるセッションを使用するには、信頼できるセッションをサポートするバインディングを持つエンドポイントを作成します。 WCF が提供する、信頼できるセッションが有効になっているシステム提供のバインディングのいずれかを使用するか、これを行う独自のカスタム バインドを作成します。
信頼できるセッションを既定でサポートして有効にするシステム定義のバインドには、次のものが含まれます。
信頼できるセッションをオプションとしてサポートするが、既定では有効にしないシステム提供のバインドには、次のようなものがあります。
カスタム バインドを作成する方法の例については、「 方法: HTTPS を使用してカスタムの信頼できるセッション バインドを作成する」を参照してください。
信頼できるセッションをサポートする WCF バインドの詳細については、「 System-Provided バインド」を参照してください。
信頼できるセッションを使用するタイミング
アプリケーションで信頼できるセッションを使用するタイミングを理解することが重要です。 WCF では、アクティブで同時に有効なエンドポイント間の信頼できるセッションがサポートされます。 アプリケーションで一定期間いずれかのエンドポイントを使用できない必要がある場合は、キューを使用して信頼性を実現します。
このシナリオで TCP 経由で接続された 2 つのエンドポイントが必要な場合は、TCP で十分な信頼性の高いメッセージ交換を提供できます。 ただし、TCP ではパケットが順番に 1 回だけ到着するため、信頼できるセッションを使用する必要はありません。
シナリオに次のいずれかの特性がある場合は、信頼できるセッションの使用を真剣に検討する必要があります。
SOAP ルーターなどの SOAP 中継局
プロキシ中継局またはトランスポート ブリッジ
断続的な接続
HTTP 経由のセッション