リライアブル メッセージング プロトコル バージョン 1.1
ここでは、HTTP トランスポートを使用した相互運用に必要な WS-ReliableMessaging 2007/02 (バージョン 1.1) プロトコルに関する Windows Communication Foundation (WCF) 実装の詳細について説明します。WCF は、ここに記載した制約と説明に基づく WS-ReliableMessaging 仕様に従っています。WS-ReliableMessaging バージョン 1.1 プロトコルは、.NET Framework Version 3.5 以降に実装されます。
WS-ReliableMessaging 2007/02 プロトコルは、ReliableSessionBindingElement により WCF に実装されます。
便宜上、ここでは次のロールを使用します。
- イニシエータ : WS-Reliable メッセージ シーケンスの作成を開始するクライアント。
- レスポンダ : イニシエータの要求を受け取るサービス。
このドキュメントでは、次の表に示すプレフィックスと名前空間を使用します。
プレフィックス |
名前空間 |
wsrm |
http://docs.oasis-open.org/ws-rx/wsrm/200702 |
netrm |
https://schemas.microsoft.com/ws/2006/05/rm |
s |
http://www.w3.org/2003/05/soap-envelope |
wsa |
https://schemas.xmlsoap.org/ws/2005/08/addressing |
wsse |
http://docs.oasis-open.org/wss/2004/01/oasis-200401-wssecurity-secext-1.0.xsd |
wsrmp |
http://docs.oasis-open.org/ws-rx/wsrmp/200702 |
netrmp |
https://schemas.microsoft.com/ws-rx/wsrmp/200702 |
wsp |
(WS-Policy 1.2 または WS-Policy 1.5 のいずれか) |
メッセージング
シーケンスの作成
WCF は、信頼できるメッセージ シーケンスを確立するために、CreateSequence メッセージと CreateSequenceResponse メッセージを実装します。以下の制約が適用されます。
- B1101: WCF イニシエータは、CreateSequence メッセージの ReplyTo、AcksTo、および Offer/Endpoint と同じエンドポイント参照を使用します。
- R1102: CreateSequence メッセージの AcksTo、ReplyTo、および Offer/Endpoint の各エンドポイント参照には、オクテット単位で一致する同じ文字列表現のアドレス値が必要です。
- WCF レスポンダは、シーケンスを作成する前に、AcksTo、ReplyTo、および Endpoint の各エンドポイント参照の URI 部分が同一であるかどうかを検証します。
- R1103: CreateSequence メッセージの AcksTo、ReplyTo、および Offer/Endpoint の各エンドポイント参照には、同一の参照パラメータのセットが必要です。
- WCF は、CreateSequence の AcksTo、ReplyTo、および Offer/Endpoint エンドポイント参照の参照パラメータが同一であることを強制しません。ただし、これらが同一であることを前提とした上で、ReplyTo エンドポイント参照からの参照パラメータを受信確認と逆方向シーケンス メッセージに使用します。
- B1104: WCF イニシエータは、CreateSequence メッセージでオプションの Expires 要素または Offer/Expires 要素を生成しません。
- B1105: CreateSequence メッセージにアクセスする場合、WCF レスポンダは、CreateSequence 要素の Expires 値をCreateSequenceResponse 要素の Expires 値として使用します。それ以外の場合、WCF レスポンダは Expires 値および Offer/Expires 値を読み込んで無視します。
- B1106: CreateSequenceResponse メッセージにアクセスする場合、WCF イニシエータは、オプションの Expires 値を読み込みますが、使用しません。
- B1107: WCF イニシエータおよびレスポンダは、CreateSequence/Offer 要素および CreateSequenceResponse 要素にオプションの IncompleteSequenceBehavior 要素を必ず生成します。
- B1108: WCF は、IncompleteSequenceBehavior 要素にある DiscardFollowingFirstGap 値および NoDiscard 値のみ使用します。
- WS-ReliableMessaging では、セッションを形成する、相関する 2 つの逆方向シーケンスを確立するために、Offer 機構を利用しています。
- B1109: CreateSequence に Offer 要素が格納されている場合、一方向 WCF レスポンダは、Accept 要素なしに CreateSequenceResponse で応答することにより、用意されたシーケンスを拒否します。
- B1110: 信頼できるメッセージング レスポンダが用意されたシーケンスを拒否する場合、WCF イニシエータは新しく確立されたシーケンスをエラーとします。
- B1111: CreateSequence に Offer 要素が格納されていない場合、双方向 WCF レスポンダは、CreateSequenceRefused フォールトで応答することにより用意されたシーケンスを拒否します。
- R1112: 2 つの逆方向シーケンスが Offer 機構を使用して確立された場合、CreateSequenceResponse/Accept/AcksTo エンドポイント参照の
[address]
プロパティは、バイト単位で CreateSequence メッセージの送信先 URI と一致する必要があります。 - R1113: 2 つの逆方向シーケンスが Offer 機構を使用して確立された場合、イニシエータからレスポンダに流れる両方のシーケンスにあるすべてのメッセージは、同じエンドポイント参照に送信される必要があります。
WCF は、WS-ReliableMessaging を使用して、イニシエータとレスポンダ間で信頼できるセッションを確立します。WCF WS-ReliableMessaging 実装により、一方向、要求/応答、双方向の各メッセージ パターンの信頼できるセッションが実現します。CreateSequence および CreateSequenceResponse で WS-ReliableMessaging の Offer 機構を使用すると、相関する 2 つの逆方向シーケンスを確立できます。また、Offer 機構は、すべてのメッセージ エンドポイントに適したセッション プロトコルを提供します。WCF では、セッション整合性を保つためのエンドツーエンドの保護を含むこのようなセッションに対してセキュリティが保証されているため、同じパーティを対象とするメッセージが同じ送信先に到着することが事実上保証されます。また、これにより、アプリケーション メッセージにシーケンス受信確認を抱き合わせることができます。したがって、制約 R1102、R1112、および R1113 が WCF に適用されています。
CreateSequence メッセージの例を次に示します。
<s:Envelope>
<s:Header>
<wsa:Action s:mustUnderstand="1">http://docs.oasis-open.org/ws-rx/wsrm/200702/CreateSequence</wsa:Action>
<wsa:MessageID>urn:uuid:949cca61-8813-42ff-ab33-18d9e3fa82fa</wsa:MessageID>
<wsa:ReplyTo>
<wsa:Address>http://Business456.com/clientA</wsa:Address>
</wsa:ReplyTo>
<wsa:To s:mustUnderstand="1">http://BusinessABC.com/serviceA</wsa:To>
</s:Header>
<s:Body>
<wsrm:CreateSequence>
<wsrm:AcksTo>
<wsa:Address>http://Business456.com/clientA</wsa:Address>
</wsrm:AcksTo>
<wsrm:Offer>
<wsrm:Identifier>urn:uuid:066b4730-fc82-458a-a5c1-210be4fb4e4e</wsrm:Identifier>
<wsrm:Endpoint>
<wsa:Address>http://Business456.com/clientA</wsa:Address>
</wsrm:Endpoint>
<wsrm:IncompleteSequenceBehavior>DiscardFollowingFirstGap</wsrm:IncompleteSequenceBehavior>
</wsrm:Offer>
</wsrm:CreateSequence>
</s:Body>
</s:Envelope>
CreateSequenceResponse メッセージの例を次に示します。
<s:Envelope>
<s:Header>
<wsa:Action s:mustUnderstand="1">http://docs.oasis-open.org/ws-rx/wsrm/200702/CreateSequenceResponse</wsa:Action>
<wsa:RelatesTo>urn:uuid:949cca61-8813-42ff-ab33-18d9e3fa82fa</wsa:RelatesTo>
<wsa:To s:mustUnderstand="1">http://Business456.com/clientA</wsa:To>
</s:Header>
<s:Body>
<wsrm:CreateSequenceResponse>
<wsrm:Identifier>urn:uuid:656652b8-9af2-4e94-9d07-2dc21c05ed27</wsrm:Identifier>
<wsrm:IncompleteSequenceBehavior>DiscardFollowingFirstGap</wsrm:IncompleteSequenceBehavior>
<wsrm:Accept>
<wsrm:AcksTo>
<wsa:Address>http://BusinessABC.com/serviceA</wsa:Address>
</wsrm:AcksTo>
</wsrm:Accept>
</wsrm:CreateSequenceResponse>
</s:Body>
</s:Envelope>
シーケンスを閉じる
WCF は、信頼できるメッセージの送信元が開始するシャットダウンに CloseSequence メッセージおよび CloseSequenceResponse メッセージを使用します。WCF の信頼できるメッセージの送信先はシャットダウンを開始せず、WCF の信頼できるメッセージング送信元は、信頼できるメッセージの送信先が開始するシャットダウンをサポートしません。以下の制約が適用されます。
- B1201: WCF の信頼できるメッセージの送信元は、シーケンスをシャットダウンする場合に、常に CloseSequence メッセージを送信します。
- B1202: 信頼できるメッセージの送信元は、CloseSequence メッセージを送信する前に、すべてのシーケンス メッセージの受信確認を待機します。
- B1203: 信頼できるメッセージの送信元は、シーケンスにメッセージが含まれない場合を除き、常にオプションの
LastMsgNumber
要素を含めます。 - R1204: 信頼できるメッセージの送信先は、CloseSequence メッセージを送信してシャットダウンを開始することはできません。
- B1205: CloseSequence メッセージを受け取ると、WCF の信頼できるメッセージの送信元はシーケンスが不完全と見なし、エラーを送信します。
CloseSequence メッセージの例を次に示します。
<s:Envelope>
<s:Header>
<wsa:Action s:mustUnderstand="1">http://docs.oasis-open.org/ws-rx/wsrm/200702/CloseSequence</wsa:Action>
<wsa:MessageID>urn:uuid:6ce1d4c3-e1c1-474f-a8c9-4210e37f7877</wsa:MessageID>
<wsa:ReplyTo>
<wsa:Address>http://Business456.com/clientA</wsa:Address>
</wsa:ReplyTo>
<wsa:To s:mustUnderstand="1">http://BusinessABC.com/serviceA</wsa:To>
</s:Header>
<s:Body>
<wsrm:CloseSequence>
<wsrm:Identifier>urn:uuid:656652b8-9af2-4e94-9d07-2dc21c05ed27</wsrm:Identifier>
<wsrm:LastMsgNumber>30</wsrm:LastMsgNumber>
</wsrm:CloseSequence>
</s:Body>
</s:Envelope>
Example CloseSequenceResponse message:
<s:Envelope>
<s:Header>
<wsrm:SequenceAcknowledgement>
<wsrm:Identifier>urn:uuid:656652b8-9af2-4e94-9d07-2dc21c05ed27</wsrm:Identifier>
<wsrm:AcknowledgementRange Lower="1" Upper="30"></wsrm:AcknowledgementRange>
<wsrm:Final></wsrm:Final>
<netrm:BufferRemaining>8</netrm:BufferRemaining>
</wsrm:SequenceAcknowledgement>
<wsa:Action s:mustUnderstand="1">http://docs.oasis-open.org/ws-rx/wsrm/200702/CloseSequenceResponse</wsa:Action>
<wsa:RelatesTo>urn:uuid:6ce1d4c3-e1c1-474f-a8c9-4210e37f7877</wsa:RelatesTo>
<wsa:To s:mustUnderstand="1">http://Business456.com/clientA</wsa:To>
</s:Header>
<s:Body>
<wsrm:CloseSequenceResponse>
<wsrm:Identifier>urn:uuid:656652b8-9af2-4e94-9d07-2dc21c05ed27</wsrm:Identifier>
</wsrm:CloseSequenceResponse>
</s:Body>
</s:Envelope>
シーケンスの終了
WCF は、CloseSequence/CloseSequenceResponse ハンドシェイクを完了した後、TerminateSequence/TerminateSequenceResponse ハンドシェイクを主に使用します。WCF の信頼できるメッセージの送信先は終了を開始せず、信頼できるメッセージの送信元は、信頼できるメッセージの送信先が開始する終了をサポートしません。以下の制約が適用されます。
- B1301: WCF イニシエータは、CloseSequence/CloseSequenceResponse ハンドシェイクが正常に完了した後にのみ、TerminateSequence メッセージを送信します。
- R1302: WCF は、
LastMsgNumber
要素が、各シーケンスのすべての CloseSequence メッセージおよび TerminateSequence メッセージに対し一貫性があることを検証します。つまり、LastMsgNumber は、すべての CloseSequence メッセージおよび TerminateSequence メッセージに存在しないか、すべての CloseSequence メッセージおよび TerminateSequence メッセージに存在し、同一でであるかのいずれかです。 - B1303: CloseSequence/CloseSequenceResponse ハンドシェイクの後、TerminateSequence メッセージを受け取ると、信頼できるメッセージの送信先が TerminateSequenceResponse メッセージで応答します。信頼できるメッセージの配信元は、TerminateSequence メッセージを送信する前に最終受信確認を受けるため、信頼できるメッセージの送信先ではシーケンスが終了したことが確実にわかり、すぐにリソースを再要求します。
- B1304: CloseSequence/CloseSequenceResponse ハンドシェイクの前に、TerminateSequence メッセージを受け取ると、WCF の信頼できるメッセージの送信先が TerminateSequenceResponse メッセージで応答します。信頼できるメッセージの送信先でシーケンスが一貫していると判断した場合、信頼できるメッセージの送信先は、リソースを再要求する前にアプリケーションの送信先で指定された時間待機し、クライアントが最終受信確認を受け取ることができるようにします。それ以外の場合は、信頼できるメッセージの送信先はすぐにリソースを再要求し、Faulted イベントを発生させて、不明なシーケンスの終了をアプリケーションの送信先に示します。
TerminateSequence メッセージの例を次に示します。
<s:Envelope>
<s:Header>
<wsa:Action s:mustUnderstand="1">http://docs.oasis-open.org/ws-rx/wsrm/200702/TerminateSequence</wsa:Action>
<wsa:MessageID>urn:uuid:3597a398-4f3c-40f4-9335-8f1515572fdf</wsa:MessageID>
<wsa:ReplyTo>
<wsa:Address>http://Business456.com/clientA</wsa:Address>
</wsa:ReplyTo>
<wsa:To s:mustUnderstand="1">http://BusinessABC.com/serviceA</wsa:To>
</s:Header>
<s:Body>
<wsrm:TerminateSequence>
<wsrm:Identifier>urn:uuid:656652b8-9af2-4e94-9d07-2dc21c05ed27</wsrm:Identifier>
<wsrm:LastMsgNumber>30</wsrm:LastMsgNumber>
</wsrm:TerminateSequence>
</s:Body>
</s:Envelope>
Example TerminateSequenceResponse message:
<s:Envelope>
<s:Header>
<wsrm:SequenceAcknowledgement>
<wsrm:Identifier>urn:uuid:656652b8-9af2-4e94-9d07-2dc21c05ed27</wsrm:Identifier>
<wsrm:AcknowledgementRange Lower="1" Upper="30"></wsrm:AcknowledgementRange>
<wsrm:Final></wsrm:Final>
<netrm:BufferRemaining>8</netrm:BufferRemaining>
</wsrm:SequenceAcknowledgement>
<wsa:Action s:mustUnderstand="1">http://docs.oasis-open.org/ws-rx/wsrm/200702/TerminateSequenceResponse</wsa:Action>
<wsa:RelatesTo>urn:uuid:3597a398-4f3c-40f4-9335-8f1515572fdf</wsa:RelatesTo>
<wsa:To s:mustUnderstand="1">://Business456.com/clientA</wsa:To>
</s:Header>
<s:Body>
<wsrm:TerminateSequenceResponse>
<wsrm:Identifier>urn:uuid:656652b8-9af2-4e94-9d07-2dc21c05ed27</wsrm:Identifier>
</wsrm:TerminateSequenceResponse>
</s:Body>
</s:Envelope>
シーケンス
シーケンスに適用される制約を以下に示します。
- B1401: WCF は、xs:long の最大値 (9223372036854775807) 以下のシーケンス番号を生成し、これらの番号にアクセスします。
Sequence ヘッダーの例を次に示します。
<wsrm:Sequence s:mustUnderstand="1">
<wsrm:Identifier>urn:uuid:656652b8-9af2-4e94-9d07-2dc21c05ed27</wsrm:Identifier>
<wsrm:MessageNumber>1</wsrm:MessageNumber>
</wsrm:Sequence>
受信確認の要求
WCF は、Keep-alive 機構として AckRequested ヘッダーを使用します。
AckRequested ヘッダーの例を次に示します。
<wsrm:AckRequested>
<wsrm:Identifier>urn:uuid:656652b8-9af2-4e94-9d07-2dc21c05ed27</wsrm:Identifier>
</wsrm:AckRequested>
SequenceAcknowledgement
WCF は、WS-ReliableMessaging で用意されているシーケンス受信確認の抱き合わせ機構を使用します。以下の制約が適用されます。
- R1601: Offer 機構を使用して 2 つの逆方向シーケンスを確立した場合、目的の受信者に送信されるアプリケーション メッセージに、SequenceAcknowledgement ヘッダーを含めることができます。リモートのエンドポイントは、追加された SequenceAcknowledgement ヘッダーにアクセスできる必要があります。
- B1602: WCF は、Nack 要素を格納する SequenceAcknowledgement ヘッダーを生成しません。WCF は、各 Nack 要素にシーケンス番号が格納されていることを検証しますが、シーケンス番号が格納されていない場合は、Nack 要素および値を無視します。
SequenceAcknowledgement ヘッダーの例を次に示します。
<wsrm:SequenceAcknowledgement>
<wsrm:Identifier>urn:uuid:656652b8-9af2-4e94-9d07-2dc21c05ed27</wsrm:Identifier>
<wsrm:AcknowledgementRange Lower="1" Upper="1"></wsrm:AcknowledgementRange>
</wsrm:SequenceAcknowledgement>
WS-ReliableMessaging エラー
WS-ReliableMessaging エラーの WCF 実装に適用される制約を以下に示します。以下の制約が適用されます。
- B1701: WCF は、MessageNumberRollover エラーを生成しません。
- B1702: SOAP 1.2 では、サービス エンドポイントが接続制限に達し、新しい接続を処理できない場合、次の例に示すように、WCF は入れ子にした CreateSequenceRefused エラー サブコード
netrm:ConnectionLimitReached
を生成します。
<s:Envelope>
<s:Header>
<wsa:Action>http://docs.oasis-open.org/ws-rx/wsrm/200702/fault</wsa:Action>
</s:Header>
<s:Body>
<s:Fault>
<s:Code>
<s:Value>s:Receiver</s:Value>
<s:Subcode>
<s:Value>wsrm:CreateSequenceRefused</s:Value>
<s:Subcode>
<s:Value>netrm:ConnectionLimitReached</s:Value>
</s:Subcode>
</s:Subcode>
</s:Code>
<s:Reason>
<s:Text xml:lang="en">Server 'http://BusinessABC.com/serviceA' is too busy to process this request. Try again later.</s:Text>
</s:Reason>
</s:Fault>
</s:Body>
</s:Envelope>
WS-Addressing エラー
WS-ReliableMessaging は WS-Addressing を使用するため、WCF の WS-ReliableMessaging 実装は、WS-Addressing エラーを生成して送信できます。ここでは、WS-ReliableMessaging レイヤで WCF が明示的に生成および送信する WS-Addressing エラーについて説明します。
- B1801: 次のいずれかに該当する場合、WCF は Message Addressing Header Required エラーを生成して送信します。
- CreateSequence、CloseSequence、または TerminateSequence メッセージに MessageId ヘッダーがない。
- CreateSequence、CloseSequence、または TerminateSequence メッセージに ReplyTo ヘッダーがない。
- CreateSequenceResponse、CloseSequenceResponse、または TerminateSequenceResponse メッセージに RelatesTo ヘッダーがない。
- B1802: WCF は、Endpoint Unavailable エラーを生成して送信し、CreateSequence メッセージにあるアドレス指定ヘッダーのチェックに基づき、シーケンスを処理できるリッスン中のエンドポイントがないことを示します。
プロトコル コンポジション
WS-Addressing によるコンポジション
WCF は、WS-Addressing の 2 つのバージョンをサポートしています。WS-Addressing 2004/08 ([WS-ADDR]) と、W3C WS-Addressing 1.0 Recommendation ([WS-ADDR-CORE] および [WS-ADDR-SOAP]) です。
WS-ReliableMessaging 仕様に記載されているのは、WS-Addressing 2004/08 だけですが、使用する WS-Addressing のバージョンが制限されているわけではありません。WCF に適用される制約を以下に示します。
- R2101: WS-Addressing 2004/08 と WS-Addressing 1.0 の両方を WS-ReliableMessaging で使用できます。
- R2102: 特定の WS-ReliableMessaging シーケンス、または Offer 機構を使用して関連付けられた逆方向シーケンスのペアでは、同じバージョンの WS-Addressing を使用する必要があります。
SOAP によるコンポジション
WCF では、WS-ReliableMessaging で SOAP 1.1 と SOAP 1.2 の両方を使用できます。
WS-Security と WS-SecureConversation によるコンポジション
WCF は、セキュリティで保護されたトランスポート (HTTPS)、WS-Security によるコンポジション、および WS-SecureConversation によるコンポジションを使用して、WS-ReliableMessaging シーケンスを保護します。WS-ReliableMessaging 1.1 プロトコル、WS-Security 1.1、および WS-Secure Conversation 1.3 プロトコルは一緒に使う必要があります。WCF に適用される制約を以下に示します。
- R2301: 個々のメッセージの整合性と機密性だけでなく、WS-ReliableMessaging シーケンスの整合性を保護するために、WCF では WS-SecureConversation を使用する必要があります。
- R2302: ****WS-ReliableMessaging シーケンスを確立する前に、WS-SecureConversation セッションを確立する必要があります。
- R2303: WS-ReliableMessaging シーケンスの有効期間が WS-SecureConversation セッションの有効期間よりも長い場合は、対応する WS-SecureConversation Renewal バインディングを使用して、WS-SecureConversation によって確立された SecurityContextToken を更新する必要があります。
- B2304: WS-ReliableMessaging シーケンスまたは相関する逆方向シーケンスのペアは、必ず同じ WS-SecureConversation セッションにバインドされます。
- R2305: WS-SecureConversation を使用して構成した場合、WCF レスポンダでは、CreateSequence メッセージに wsse:SecurityTokenReference 要素および wsrm:UsesSequenceSTR ヘッダーが含まれていることが必要です。
UsesSequenceSTR ヘッダーの例を次に示します。
<wsrm:UsesSequenceSTR></wsrm:UsesSequenceSTR>
SSL/TLS セッションによるコンポジション
WCF は、次のようにSSL/TLS セッションによるコンポジションをサポートしていません。
- B2401: WCF は、wsrm:UsesSequenceSSL ヘッダーを生成しません。
- R2402: 信頼できるメッセージのイニシエータは、WCF レスポンダに wsrm:UsesSequenceSSL ヘッダーが付いた CreateSequence メッセージを送信できません。
WS-Policy によるコンポジション
WCF は、WS-Policy 1.2 および WS-Policy 1.5 の 2 つのバージョンの WS-Policy をサポートしています。
WS-ReliableMessaging の WS-Policy アサーション
WCF は、WS-ReliableMessaging の wsrm:RMAssertion WS-Policy アサーションを使用して、エンドポイントの機能を記述します。WCF に適用される制約を以下に示します。
B3001: WCF は、wsrmn:RMAssertion WS-Policy アサーションを wsdl:binding 要素に添付します。WCF は、wsdl:binding 要素および wsdl:port 要素への添付をサポートしています。
B3002: WCF は、wsp:Optional タグを生成しません。
B3003: wsrmp:RMAssertion WS-Policy アサーションにアクセスする場合、WCF は wsp:Optional タグを無視し、WS-RM ポリシーを必須のポリシーとして使用します。
R3004: WCF は SSL/TLS セッションで構成できないため、WCF は wsrmp:SequenceTransportSecurity を指定するポリシーを受け付けません。
B3005: WCF は、常に wsrmp:DeliveryAssurance 要素を生成します。
B3006: WCF は常に wsrmp:ExactlyOnce 配信保証を指定します。
B3007: WCF は、WS-ReliableMessaging アサーションの以下のプロパティを生成して読み込み、WCF の ReliableSessionBindingElement でこれらのプロパティを制御します。
- netrmp:InactivityTimeout
- netrmp:AcknowledgementInterval
RMAssertion の例を次に示します。
<wsrmp:RMAssertion> <wsp:Policy> <wsrmp:SequenceSTR/> <wsrmp:DeliveryAssurance> <wsp:Policy> <wsrmp:ExactlyOnce/> <wsrmp:InOrder/> </wsp:Policy> </wsrmp:DeliveryAssurance> </wsp:Policy> <netrmp:InactivityTimeout Milliseconds="600000"/> <netrmp:AcknowledgementInterval Milliseconds="200"/> </wsrmp:RMAssertion>
WS-ReliableMessaging のフロー制御拡張
WCF は、WS-ReliableMessaging の機能拡張を使用して、シーケンス メッセージ フローのさらに厳密な制御を実現します。
フロー制御を有効にするには、ReliableSessionBindingElement の FlowControlEnabled boolean プロパティを true に設定します。WCF に適用される制約を以下に示します。
B4001: 信頼できるメッセージング フロー制御を有効にした場合、次の例に示すように、WCF は SequenceAcknowledgement ヘッダーの要素拡張で netrm:BufferRemaining 要素を生成します。
<wsrm:SequenceAcknowledgement> <wsrm:Identifier>urn:uuid:656652b8-9af2-4e94-9d07-2dc21c05ed27</wsrm:Identifier> <wsrm:AcknowledgementRange Upper="1" Lower="1"/> <netrm:BufferRemaining>8</netrm:BufferRemaining> </wsrm:SequenceAcknowledgement>
B4002: 信頼できるメッセージング フロー制御を有効にした場合でも、WCF では SequenceAcknowledgement ヘッダーに netrm:BufferRemaining 要素は必要ありません。
B4003: WCF の信頼できるメッセージの送信先は、netrm:BufferRemaining を使用して、バッファに保持できる新しいメッセージの数を示します。
B4004: 信頼できるメッセージング フロー制御を有効にした場合、WCF の信頼できるメッセージング送信元は netrm:BufferRemaining の値を使用してメッセージの転送を調整します。
B4005 : WCF は、0 ~ 4096 の整数値の netrm:BufferRemaining を生成し、0 ~ 214748364 (xs:int の maxInclusive 値) の整数値を読み取ります。
メッセージ交換パターン
ここでは、WS-ReliableMessaging をさまざまなメッセージ交換パターンに使用する際の WCF の動作について説明します。各メッセージ交換パターンについて、次の 2 つの展開シナリオを考えます。
- アドレス不可能なイニシエータ : イニシエータはファイアウォールの内側にあります。レスポンダは HTTP 応答でのみイニシエータにメッセージを配信できます。
- アドレス可能なイニシエータ : イニシエータとレスポンダの両方に HTTP 要求を送信できます。つまり、逆方向の 2 つの HTTP 接続を確立できます。
一方向 : アドレス不可能なイニシエータ
バインディング
WCF は、1 つの HTTP チャネルで 1 つのシーケンスを使用する一方向メッセージ交換パターンを提供します。WCF は、HTTP 要求を使用してイニシエータからレスポンダにすべてのメッセージを送信し、HTTP 応答を使用してレスポンダからイニシエータにすべてのメッセージを送信します。
CreateSequence の交換
WCF イニシエータは、HTTP 要求で Offer 要素のない CreateSequence メッセージを転送し、HTTP 応答で CreateSequenceResponse メッセージを待機します。WCF レスポンダは、シーケンスを作成し、HTTP 応答で Accept 要素のない CreateSequenceResponse メッセージを転送します。
SequenceAcknowledgement
WCF イニシエータは、CreateSequence メッセージとエラー メッセージを除くすべてのメッセージの応答で受信確認を処理します。WCF レスポンダは、すべてのシーケンス メッセージと AckRequested メッセージへの HTTP 応答として、必ずスタンドアロンの受信確認を転送します。
CloseSequence の交換
WCF イニシエータは、HTTP 要求で CloseSequence メッセージを転送し、HTTP 応答で CreateSequenceResponse メッセージを待機します。WCF レスポンダは、HTTP 応答で CloseSequenceResponse メッセージを転送します。
TerminateSequence の交換
WCF イニシエータは、HTTP 要求で TerminateSequence メッセージを転送し、HTTP 応答で TerminateSequenceResponse メッセージを待機します。WCF レスポンダは、HTTP 応答で TerminateSequenceResponse メッセージを転送します。
一方向 : アドレス可能なイニシエータ
バインディング
WCF には、受信用 HTTP チャネルと送信用 HTTP チャネルで 1 つのシーケンスを使用する一方向メッセージ交換パターンが用意されています。WCF は、HTTP 要求を使用してすべてのメッセージを送信します。すべての HTTP 応答に、空の本文と HTTP 202 ステータス コードが含まれます。
CreateSequence の交換
WCF イニシエータは、HTTP 要求で Offer 要素のない CreateSequence メッセージを転送します。WCF レスポンダは、シーケンスを作成し、HTTP 要求で Accept 要素のない CreateSequenceResponse メッセージを転送します。
双方向 : アドレス可能なイニシエータ
バインディング
WCF には、受信用 HTTP チャネルと送信用 HTTP チャネルで 2 つのシーケンスを使用する、完全に非同期の双方向メッセージ交換パターンが用意されています。このメッセージ交換パターンは、限定された方法で Addressable イニシエータ メッセージ交換パターンの Request/Reply に組み込むことができます。WCF は、すべてのメッセージの転送に HTTP 要求を使用します。すべての HTTP 応答に、空の本文と HTTP 202 ステータス コードが含まれます。
CreateSequence の交換
WCF イニシエータは、HTTP 要求で Offer 要素のある CreateSequence メッセージを転送します。WCF レスポンダは、CreateSequence に Offer 要素があることを確認し、シーケンスを作成して Accept 要素のない CreateSequenceResponse メッセージを転送します。
シーケンスの有効期間
WCF は、2 つのシーケンスを 1 つの完全な双方向セッションとして処理します。
一方のシーケンスをフォールトするエラーが生成されると、WCF は、リモート エンドポイントに両方のシーケンスをフォールトするよう要求します。一方のシーケンスをフォールトするエラーを読み取ると、WCF は両方のシーケンスをフォールトします。
WCF は、送信シーケンスを終了し、受信シーケンスで引き続きメッセージを処理できます。逆に、WCF は、受信シーケンスの終了を処理し、送信シーケンスで引き続きメッセージを送信することもできます。
要求/応答および一方向のアドレス不可能なイニシエータ
バインディング
WCF には、1 つの HTTP チャネルで 2 つのシーケンスを使用する、一方向の要求/応答メッセージ交換パターンが用意されています。WCF は、HTTP 要求を使用してイニシエータからレスポンダにすべてのメッセージを送信し、HTTP 応答を使用してレスポンダからイニシエータにすべてのメッセージを送信します。
CreateSequence の交換
WCF イニシエータは、HTTP 要求で Offer 要素がある CreateSequence メッセージを転送し、HTTP 応答で CreateSequenceResponse メッセージを待機します。WCF レスポンダは、シーケンスを作成し、HTTP 応答で Accept 要素がある CreateSequenceResponse メッセージを転送します。
一方向のメッセージ
一方向メッセージ交換を正常に完了するために、WCF イニシエータは、HTTP 要求で要求シーケンス メッセージを送信し、HTTP 応答でスタンドアロンの SequenceAcknowledgement メッセージを受信します。SequenceAcknowledgement は、送信されたメッセージの受信確認を行う必要があります。
WCF レスポンダは、受信確認、エラー、または空の本文と HTTP 202 ステータス コードによる応答で要求に応答します。
双方向のメッセージ
双方向メッセージ交換プロトコルを正常に完了するために、WCF イニシエータは、HTTP 要求で要求シーケンス メッセージを送信し、HTTP 応答で応答シーケンス メッセージを受信します。応答では、送信された要求シーケンス メッセージの受信確認を行う SequenceAcknowledgement を送信する必要があります。
WCF レスポンダは、アプリケーション応答、エラー、または空の本文と HTTP 202 ステータス コードで要求に応答できます。
一方向のメッセージが存在することと、アプリケーション応答のタイミングもあるため、要求シーケンス メッセージのシーケンス番号と応答メッセージのシーケンス番号には相関関係はありません。
応答の再試行
WCF は、双方向メッセージ交換プロトコルの相関関係について、HTTP 要求/応答の相関関係に依存しています。このため、WCF イニシエータは、要求シーケンス メッセージが受信確認されたときではなく、HTTP 応答によって SequenceAcknowledgement、アプリケーション応答、またはエラーが送信されたときに、要求シーケンス メッセージの再試行を停止します。WCF レスポンダは、応答が関連付けられている要求の HTTP 要求で応答を再試行します。
CloseSequence の交換
すべての一方向の要求シーケンス メッセージが、すべての応答シーケンス メッセージおよび受信確認を受信した後、WCF イニシエータは、HTTP 要求で要求シーケンスに CloseSequence メッセージを転送し、HTTP 応答で CloseSequenceResponse を待機します。
要求シーケンスを終了すると、暗黙的に応答シーケンスが終了します。つまり、WCF イニシエータは、CloseSequence メッセージに応答シーケンスの最終的な SequenceAcknowledgement を含め、応答シーケンスには CloseSequence 交換がありません。
WCF レスポンダは、すべての応答が受信確認されたことを確認し、HTTP 応答で CloseSequenceResponse メッセージを転送します。
TerminateSequence の交換
CloseSequenceResponse メッセージを受け取った後、WCF イニシエータは HTTP 要求で要求シーケンスに TerminateSequence メッセージを転送し、HTTP 応答で TerminateSequenceResponse を待機します。
CloseSequence 交換と同じように、要求シーケンスを終了すると、暗黙的に応答シーケンスが終了します。つまり、WCF イニシエータは、TerminateSequence メッセージに応答シーケンスの最終的な SequenceAcknowledgement を含め、応答シーケンスには TerminateSequence 交換がありません。
WCF レスポンダは、HTTP 応答で TerminateSequenceResponse メッセージを転送します。
要求/応答 : アドレス可能なイニシエータ
バインディング
WCF には、受信用 HTTP チャネルと送信用 HTTP チャネルで 2 つのシーケンスを使用する、要求/応答メッセージ交換パターンが用意されています。このメッセージ交換パターンは、限定された方法で Duplex, Addressable イニシエータ メッセージ交換パターンに組み込むことができます。WCF は、すべてのメッセージの転送に HTTP 要求を使用します。すべての HTTP 応答に、空の本文と HTTP 202 ステータス コードが含まれます。
CreateSequence の交換
WCF イニシエータは、HTTP 要求で Offer 要素のある CreateSequence メッセージを転送します。WCF レスポンダは、CreateSequence に Offer 要素があることを確認し、シーケンスを作成して Accept 要素がある CreateSequenceResponse メッセージを転送します。
要求/応答の相関関係
次の状況は、すべての相関関係にある要求/応答で発生します。
- WCF は、すべてのアプリケーション要求メッセージに ReplyTo エンドポイント参照と MessageId が保持されていることを確認します。
- WCF は、各アプリケーション要求メッセージの ReplyTo としてローカル エンドポイント参照を適用します。ローカル エンドポイント参照は、イニシエータの CreateSequence メッセージの ReplyTo であり、レスポンダの CreateSequence メッセージの To です。
- WCF は、受信要求メッセージに MessageId と ReplyTo が保持されていることを確認します。
- WCF は、すべてのアプリケーション要求メッセージの ReplyTo エンドポイント参照の URI が、先に定義したローカル エンドポイント参照と一致していることを確認します。
- WCF は、
wsa
要求/応答の相関ルールに従い、すべての応答に正しい RelatesTo ヘッダーおよび To ヘッダーが保持されていることを確認します。