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