共用方式為


可靠的傳訊通訊協定 1.1 版

本主題涵蓋 WS-ReliableMessaging 2007 年 2 月(1.1 版)通訊協定所需的 Windows Communication Foundation(WCF)實作細節,以使用 HTTP 傳輸進行互操作。 WCF 遵循 WS-ReliableMessaging 規格,其中包含本主題中所述的條件約束和釐清。 請注意,WS-ReliableMessaging 1.1 版通訊協定是從 .NET Framework 3.5 開始實作。

WS-ReliableMessaging 2007 年 2 月通訊協定是由 ReliableSessionBindingElement實作在 WCF 中。

為了方便起見,本主題會使用下列角色:

  • 發起者:啟動 WS-Reliable 訊息序列建立的客戶端。

  • 回應者:接收啟動器要求的服務。

本檔使用下表中的前置詞和命名空間。

前綴 Namespace
wsrm http://docs.oasis-open.org/ws-rx/wsrm/200702
netrm http://schemas.microsoft.com/ws/2006/05/rm
s http://www.w3.org/2003/05/soap-envelope
wsa http://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 http://schemas.microsoft.com/ws-rx/wsrmp/200702
wsp (WS-Policy 1.2 或 WS-Policy 1.5)

訊息傳送

序列創建

WCF 會實作 CreateSequenceCreateSequenceResponse 訊息,以建立可靠的傳訊順序。 適用下列條件約束:

  • B1101:WCF 初始化程序使用與 CreateSequence 訊息的 ReplyToAcksToOffer/Endpoint 相同的端點參考。

  • R1102:AcksTo 訊息中的 ReplyToOffer/EndpointCreateSequence 端點參考必須具有地址值,這些地址值必須具有相同的字串表示方式,以便逐位匹配。

    • WCF 回應程式會先確認 AcksToReplyToEndpoint 端點參考的 URI 部分在建立序列之前相同。
  • R1103:AcksTo訊息中的 ReplyToOffer/EndpointCreateSequence 端點參考應該具有相同的參考參數集。

    • WCF 不會強制執行,但假設 AcksToReplyToOffer/Endpoint 上的端點參考的參考參數是相同的,並使用來自 CreateSequence 端點參考的參考參數來進行認可和傳送相反序列訊息。
  • B1104:WCF 啟動器不會在 Expires 訊息中生成可選的 Offer/ExpiresCreateSequence 元素。

  • B1105:存取 CreateSequence 訊息時,WCF 回應程式會使用 Expires 元素中的 CreateSequence 值做為 Expires 元素中的 CreateSequenceResponse 值。 否則,WCF 回應程式會讀取並忽略 ExpiresOffer/Expires 值。

  • B1106:存取 CreateSequenceResponse 訊息時,WCF 啟動器會讀取選擇性 Expires 值,但不會使用它。

  • B1107:WCF 啟動器和回應程式一律會在 IncompleteSequenceBehaviorCreateSequence/Offer 元素中生成選擇性CreateSequenceResponse元素。

  • B1108:WCF 只使用 DiscardFollowingFirstGapNoDiscard 的值在 IncompleteSequenceBehavior 元素中。

    • WS-ReliableMessaging 利用 Offer 機制來建立兩個互為相反且相關的序列,形成一個會話。
  • B1109:如果CreateSequence包含 Offer 元素,單向 WCF 回應程式會透過不包含 CreateSequenceResponse 元素的Accept來拒絕提供的序列。

  • B1110:如果可靠的傳訊回應程序拒絕提供的順序,WCF 啟動器會錯誤新建立的序列。

  • B1111:如果 CreateSequence 不包含 Offer 元素,雙向 WCF 回應程式會以 CreateSequenceRefused 錯誤來回應拒絕已提供的序列。

  • R1112:當使用 Offer 機制建立兩個相反序列時,[address] 端點參考的 CreateSequenceResponse/Accept/AcksTo 屬性必須與 CreateSequence 訊息的目的地 URI 完全逐位元組相符。

  • R1113:當使用 Offer 機制建立兩個互動序列時,這兩個序列中從啟始者流向應答者的所有訊息都必須傳送至相同的端點參考。

WCF 會使用 WS-ReliableMessaging 來建立啟動器與回應程式之間的可靠會話。 WCF WS-ReliableMessaging 實作為單向通信、要求-回覆以及完整雙向通信模式,提供可靠的通訊協定。 OfferCreateSequence 上的 WS-ReliableMessaging CreateSequenceResponse 機制可讓您建立兩個相互關聯的對話序列,並提供適合所有訊息端點的會話協定。 因為 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 會使用 CloseSequenceCloseSequenceResponse 訊息來進行可靠訊息來源啟動的關機。 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>

範例 CloseSequenceResponse 訊息:

<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 主要會在完成TerminateSequence/TerminateSequenceResponse交握之後使用CloseSequence/CloseSequenceResponse交握。 WCF 可靠訊息的目的地不會主動終止,而且可靠訊息的來源不支援由目的地主動發起的終止。 適用下列條件約束:

  • B1301:WCF 啟動器只會在順利完成TerminateSequence交握之後傳送CloseSequence/CloseSequenceResponse訊息。

  • R1302:WCF 驗證 LastMsgNumber 元素是否在所有 CloseSequenceTerminateSequence 訊息中對應的指定序列中保持一致。 這表示LastMsgNumber不存在於所有 CloseSequenceTerminateSequence 訊息,或者存在於所有 CloseSequenceTerminateSequence 訊息且是相同的。

  • B1303:在交握TerminateSequence之後收到CloseSequence/CloseSequenceResponse訊息時,Reliable Messaging 端點會以TerminateSequenceResponse訊息回應。 由於可靠訊息傳遞來源在傳送 TerminateSequence 訊息之前具有最後確認,因此可靠訊息傳遞目的地無疑知道序列已結束,並立即回收資源。

  • B1304:當在握手 TerminateSequence 之前收到 CloseSequence/CloseSequenceResponse 訊息時,WCF 可靠傳訊目的地會以 TerminateSequenceResponse 訊息回應。 如果 Reliable Messaging 目的地判斷序列中沒有不一致的情況,Reliable Messaging 目的地會等候應用程式目的地指定的時間,再回收資源,讓客戶端有機會接收最終認可。 否則,Reliable Messaging 接收端會立即回收資源,並透過觸發 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>

範例 TerminateSequenceResponse 訊息:

<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 使用 AckRequested 標頭作為保持連接活躍的機制。

標題的 AckRequested 範例。

<wsrm:AckRequested>
  <wsrm:Identifier>urn:uuid:656652b8-9af2-4e94-9d07-2dc21c05ed27</wsrm:Identifier>
</wsrm:AckRequested>

序列確認

WCF 會針對 WS-Reliable 傳訊中提供的序列通知使用「回溯」機制。 適用下列條件約束:

  • R1601:使用 Offer 機制建立兩個相反序列時, SequenceAcknowledgement 標頭可能會包含在傳送給預定收件者的任何應用程式訊息中。 遠端端點必須能夠存取附載的 SequenceAcknowledgement 標頭。

  • B1602:WCF 不會產生 SequenceAcknowledgement 包含 Nack 項目的標頭。 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 錯誤

以下是適用於 WCF 實現 WS-ReliableMessaging 錯誤的限制清單。 適用下列條件約束:

  • B1701:WCF 不會產生 MessageNumberRollover 錯誤。

  • B1702:在 SOAP 1.2 上,當服務端點達到其連線限制且無法處理新連線時,WCF 會產生巢狀錯誤子代碼 CreateSequenceRefusednetrm: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 尋址,因此 WCF WS-ReliableMessaging 實作可能會產生並傳輸 WS-Addressing 錯誤。 本節涵蓋 WCF 明確在 WS-Addressing 層產生並在 WS-ReliableMessaging 層傳輸的錯誤:

  • B1801:WCF 會在下列其中一項成立時產生並傳輸 Message Addressing Header Required 錯誤:

    • 某個 CreateSequenceCloseSequenceTerminateSequence 訊息缺少MessageId標題。

    • 某個 CreateSequenceCloseSequenceTerminateSequence 訊息缺少ReplyTo標題。

    • CreateSequenceResponseCloseSequenceResponseTerminateSequenceResponse 訊息遺漏RelatesTo標頭。

  • B1802:WCF 會產生並傳輸 Endpoint Unavailable 錯誤,指出沒有端點接聽可以根據訊息中 CreateSequence 尋址標頭的檢查來處理序列。

通訊協議組合

使用 WS-Addressing 進行創作

WCF 支援兩個版本的 WS 尋址:WS-Addressing 2004/08 [WS-ADDR] 和 W3C WS-Addressing 1.0 建議 [WS-ADDR-CORE] 和 [WS-ADDR-SOAP]。

雖然 WS-ReliableMessaging 規格只提及 2004/08 WS-Addressing,但不會限制要使用的 WS-Addressing 版本。 以下是套用至 WCF 的條件約束清單:

  • R2101:WS-Addressing 2004/08 和 WS-Addressing 1.0 都可以搭配 WS-Reliable 傳訊使用。

  • R2102:單一版本的 WS-Addressing 必須在整個給定的 WS-ReliableMessaging 序列中使用,或在一組使用 Offer 機制相互關聯的對應序列中使用。

使用SOAP進行組合

WCF 支援使用 WS-Reliable 進行 SOAP 1.1 和 SOAP 1.2 的傳訊。

與 WS-Security 和 WS-SecureConversation 的組合

WCF 使用安全傳輸 (HTTPS)、搭配 WS-Security 撰寫,以及搭配 WS-Secure Conversation 組合,為 WS-ReliableMessaging 序列提供保護。 WS-ReliableMessaging 1.1 通訊協定、WS-Security 1.1 和 WS-Secure Conversation 1.3 通訊協議應該一起使用。 以下是套用至 WCF 的條件約束清單:

  • R2301:除了個別訊息的完整性和機密性之外,為了保護 WS-ReliableMessaging 序列的完整性,WCF 需要使用 WS-Secure 交談。

  • R2302:必須先建立AWS-Secure 對話會話,然後才能建立 WS-ReliableMessaging 序列。

  • R2303:如果 WS-ReliableMessaging 序列存留期超過 WS-Secure 對話會話的存留期,則必須使用相應的 WS-Secure 對話更新綁定,來更新使用 WS-Secure 對話建立的 SecurityContextToken

  • B2304:WS-ReliableMessaging 序列或一組相互關聯的相反序列一律系結至單一 WS-SecureConversation 會話。

  • R2305:使用 WS-Secure Conversation 撰寫時,WCF 回應程式會要求 CreateSequence 訊息包含 wsse:SecurityTokenReference 元素和 wsrm:UsesSequenceSTR 標頭。

範例的 UsesSequenceSTR 標題。

<wsrm:UsesSequenceSTR></wsrm:UsesSequenceSTR>

SSL/TLS 會話的構成

WCF 不支援整合 SSL/TLS 會話:

  • B2401:WCF 不會產生 wsrm:UsesSequenceSSL 標頭。

  • R2402:可靠消息啟動器不得向 WCF 回應程式傳送具有 CreateSequence 標頭的 wsrm:UsesSequenceSSL 訊息。

使用 WS-Policy 撰寫

WCF 支援兩個版本的 WS-Policy:WS-Policy 1.2 和 WS-Policy 1.5。

WS-ReliableMessaging WS-Policy 斷言

WCF 會使用 WS-ReliableMessaging WS-Policy 判斷提示 wsrm:RMAssertion 來描述端點功能。 以下是套用至 WCF 的條件約束清單:

  • B3001:WCF 會將 wsrmn:RMAssertion WS-Policy 斷言附加至 wsdl:binding 元素。 WCF 支援同時附加到wsdl:bindingwsdl: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 斷言的屬性,並在 WCFReliableSessionBindingElement 上對這些屬性提供控制:

    • 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.FlowControlEnabledtrue,以啟用流程控制。 以下是套用至 WCF 的條件約束清單:

  • B4001:啟用可靠的傳訊流程控制時,WCF 會在 netrm:BufferRemaining 標頭的 SequenceAcknowledgement 元素擴充性中產生元素,如下列範例所示。

    <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 不需要 netrm:BufferRemaining 標頭中的 SequenceAcknowledgement 元素。

  • B4003:WCF 可靠傳訊目的地會使用 netrm:BufferRemaining 來指出它可以緩衝多少個新訊息。

  • B4004:啟用可靠的訊息流程控制時,WCF 可靠訊息來源會使用netrm:BufferRemaining的值來節流訊息傳輸。

  • B4005:WCF 會產生 netrm:BufferRemaining 介於 0 到 4096 之間的整數值,並讀取介於 0 到 xs:int內含值 maxInclusive 之間的整數值214748364。

訊息交換模式

本節說明當 WS-ReliableMessaging 用於不同訊息交換模式時,WCF 的行為。 針對每個訊息交換模式,會考慮下列兩個部署案例:

  • 不可尋址的啟動器:啟動器位於防火牆後方;回應者只能在 HTTP 回應上將訊息傳遞至啟動器。

  • 可尋址的啟動器:啟動器和回應者都可以傳送 HTTP 要求;換句話說,可以建立兩個相反的 HTTP 連線。

單向、不可尋址的啟動器

捆綁

WCF 透過一個 HTTP 通道使用一個序列,提供單向訊息交換模式。 WCF 會使用 HTTP 要求,將來自啟動器的所有訊息傳送至回應者,以及 HTTP 回應,將所有訊息從回應者傳輸到啟動器。

CreateSequence Exchange

WCF 啟動器會在 HTTP 要求中傳送一個沒有 CreateSequence 元素的 Offer 訊息,並預期在 HTTP 回應上收到 CreateSequenceResponse 訊息。 WCF 回應程式會建立序列,並傳輸沒有 CreateSequenceResponse 元素的 Accept 訊息至 HTTP 回應。

序列確認

WCF 啟動器會處理除了 CreateSequence 訊息和錯誤訊息之外所有訊息的確認。 WCF 回應程式一律會將 HTTP 回應上的獨立通知傳送至所有序列和 AckRequested 訊息。

CloseSequence Exchange

WCF 啟動器透過 HTTP 要求傳輸 CloseSequence 訊息,並預期 HTTP 回應會收到 CreateSequenceResponse 訊息。 WCF 回應程式會在 CloseSequenceResponse HTTP 回應上傳輸訊息。

TerminateSequence Exchange

WCF 啟動器透過 HTTP 要求傳輸 TerminateSequence 訊息,並預期 HTTP 回應會收到 TerminateSequenceResponse 訊息。 WCF 回應程式會在 TerminateSequenceResponse HTTP 回應上傳輸訊息。

單向可尋址啟動器

捆綁

WCF 透過一個序列,以單向訊息交換模式處理一個輸入和一個輸出 HTTP 通道。 WCF 會使用 HTTP 要求來傳輸所有訊息。 所有 HTTP 回應都有空白本文和 HTTP 202 狀態代碼。

CreateSequence Exchange

WCF 發起程式會在 HTTP 要求中傳送不含 CreateSequence 元素的 Offer 訊息。 WCF 回應端會建立系列訊息,並在 HTTP 要求上傳送沒有 CreateSequenceResponse 元素的 Accept 訊息。

雙工、可尋址啟動器

捆綁

WCF 透過一個輸入和一個輸出 HTTP 通道,使用兩個序列,提供完全異步的雙向訊息交換模式。 此訊息交換模式可以透過有限的方式與 Request/ReplyAddressable 啟動器訊息交換模式混合。 WCF 會使用 HTTP 要求來傳輸所有訊息。 所有 HTTP 回應都有空白本文和 HTTP 202 狀態代碼。

CreateSequence Exchange

WCF 啟動器在 HTTP 要求上傳送具有 CreateSequence 元素的 Offer 訊息。 WCF 回應程式可確保 CreateSequence 具有 Offer 元素,然後建立序列,並透過具備CreateSequenceResponse元素的方式傳輸 Accept 訊息。

序列壽命

WCF 將這兩個序列視為一個完整的雙工會話。

當產生故障造成一個序列發生故障時,WCF 預期遠端端點會使所有序列發生故障。 當讀取某一序列的錯誤時,WCF 會使兩個序列同時發生錯誤。

WCF 可以關閉其輸出序列,並繼續處理其輸入序列上的訊息。 相反地,WCF 可以處理輸入序列的關閉,並繼續在其輸出序列上傳送訊息。

Request-Reply 和單向、不可尋址的啟動器

捆綁

WCF 透過一個 HTTP 通道使用兩個序列,提供單向和要求-回復訊息交換模式。 WCF 會使用 HTTP 要求,將來自啟動器的所有訊息傳送至回應者,以及 HTTP 回應,將所有訊息從回應者傳輸到啟動器。

CreateSequence Exchange

WCF 啟動器會在 HTTP 要求中傳送包含 CreateSequence 元素的Offer訊息,並預期在 HTTP 回應中接收到 CreateSequenceResponse 訊息。 WCF 回應程式會建立序列,並在 HTTP 回應中使用 CreateSequenceResponse 元素傳輸 Accept 訊息。

單向訊息

為了順利完成單向訊息交換,WCF 啟動器會在 HTTP 要求上傳輸要求順序訊息,並在 HTTP 回應上接收獨立 SequenceAcknowledgement 訊息。 必須確認 SequenceAcknowledgement 傳送的訊息。

WCF 回應者可能會以確認訊息、錯誤,或是訊息本文為空且帶有 HTTP 202 狀態代碼的回應來回復該請求。

双向訊息

為了順利完成雙向訊息交換通訊協定,WCF 啟動器會在 HTTP 要求上傳輸要求順序訊息,並在 HTTP 回應上接收回復順序訊息。 回應必須包含 SequenceAcknowledgement 認可傳送的要求順序訊息。

WCF 回應者可以使用應用回應、錯誤或內容為空並包含 HTTP 202 狀態代碼的回應來回應要求。

由於有單向訊息和應用程式回復的時間,要求順序消息的序號和回應訊息的序號沒有相互關聯。

嘗試重新回覆

WCF 依賴 HTTP 要求-回復相互關聯來進行雙向訊息交換通訊協定相互關聯。 因此,WCF 啟動器不會在要求順序訊息被認可時停止重試,而是在 HTTP 回應包含 SequenceAcknowledgement、應用程式回復或錯誤訊息時才停止重試。 WCF 回應者會針對與回復相應的請求之 HTTP 回應進行重試。

CloseSequence Exchange

在接收到所有回覆順序訊息和所有單向要求順序訊息的確認後,WCF 啟動器會在 HTTP 請求上傳輸一則適用於該要求序列的 `CloseSequence` 訊息,並在 HTTP 回應中預期接收 `CloseSequenceResponse`。

關閉要求序列會隱含關閉回復順序。 這意味著 WCF 啟動器在SequenceAcknowledgement訊息中包含回復序列的 FinalCloseSequence,且回復序列沒有CloseSequence交換。

WCF 回應程式可確保認可所有回復,並在 HTTP 回應上傳輸 CloseSequenceResponse 訊息。

TerminateSequence Exchange

收到 CloseSequenceResponse 訊息之後,WCF 啟動器會在 HTTP 要求上傳送一則 TerminateSequence 訊息作為請求序列,並期望在 HTTP 回應中接收到 TerminateSequenceResponse

CloseSequence如同交換,終止要求序列會隱含終止回復順序。 這表示 WCF 啟動器在SequenceAcknowledgement的訊息中包含回復序列的最後的TerminateSequence,且回復序列沒有TerminateSequence交換過程。

WCF 回應程式會在 TerminateSequenceResponse HTTP 回應上傳輸訊息。

要求/回復、可定址啟動器

捆綁

WCF 透過一個輸入和一個輸出 HTTP 通道,使用兩個序列來提供要求-回復訊息交換模式。 此訊息交換模式可以透過有限的方式與 Duplex, Addressable 啟動器訊息交換模式混合。 WCF 會使用 HTTP 要求來傳輸所有訊息。 所有 HTTP 回應都有空白本文和 HTTP 202 狀態代碼。

CreateSequence Exchange

WCF 啟動器在 HTTP 要求上傳送具有 CreateSequence 元素的 Offer 訊息。 WCF 回應程式確保 CreateSequence 具有 Offer 元素,然後建立序列,並傳輸包含 CreateSequenceResponse 元素的 Accept 訊息。

要求/回復相互關聯

下列內容適用於所有相互關聯的要求和回復:

  • WCF 可確保所有應用程式要求訊息都具有 ReplyTo 端點參考和 MessageId

  • WCF 會將本機端點參考套用為每個應用程式要求訊息的 ReplyTo。 本機端點參考是 CreateSequence 啟動器的訊息 ReplyTo ,以及 CreateSequence 回應者的訊息 To

  • WCF 確保傳入的請求訊息包含 MessageIdReplyTo

  • WCF 可確保 ReplyTo 端點參考的所有應用程式要求訊息 URI 符合稍早定義的本機端點參考。

  • WCF 可確保所有回復都遵循要求/回復相互關聯規則,並具有正確的 RelatesTo 標頭Towsa