共用方式為


可靠的傳訊通訊協定 1.0 版

本主題涵蓋 2005 年 2 月通訊 WS-Reliable 通訊協定(1.0 版)通訊協定所需的 Windows Communication Foundation (WCF) 實作詳細數據,以使用 HTTP 傳輸進行互作。 WCF 遵循 WS-Reliable 傳訊規格,其中包含本主題中所述的條件約束和釐清。 請注意,從 WinFX 開始,會實作 WS-ReliableMessaging 1.0 版通訊協定。

WS-Reliable 傳訊 2005 年 2 月協議在 WCF 中由 ReliableSessionBindingElement 實作。

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

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

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

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

前綴 Namespace
wsrm http://schemas.xmlsoap.org/ws/2005/02/rm
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

訊息傳送

序列建立信息

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

  • B1101:WCF 啟動器不會在CreateSequence訊息中產生選擇性的 Expires 元素,或者,在CreateSequence訊息包含Offer元素時,於Expires元素中產生選擇性的Offer元素。

  • B1102:存取 CreateSequence 訊息時,WCFResponder 會在存在時傳送和接收這兩 Expires 個元素,但不會使用其值。

WS-Reliable 傳訊引進了 Offer 機制,以建立一個會話所需的兩個相對且互相關聯的序列。

  • R1103:如果 CreateSequence 包含 Offer 元素,Reliable Messaging Responder 必須接受序列,並回應一個包含 CreateSequenceResponse 元素的 wsrm:Accept,形成兩個相關聯的對應序列,或拒絕 CreateSequence 要求。

  • R1104:SequenceAcknowledgement 和反向序列中流動的應用程式訊息必須被傳送至 ReplyToCreateSequence端點參考。

  • R1105:AcksToReplyTo 中的 CreateSequence 端點參考的位址值必須逐字節完全匹配。

    WCF 回應程式會在建立序列之前,確認 AcksToReplyTo EPR 的 URI 部分是否相同。

  • R1106: AcksToReplyTo 中的 CreateSequence 端點參考應該具有相同的參考參數集。

    WCF 不會強制執行,但假設 AcksTo 上的 ReplyToCreateSequence 的 [參考參數] 是相同的,並使用 ReplyTo 端點參考中的 [參考參數] 進行認可和回應序列訊息。

  • R1107:當使用 Offer 機制建立兩個相反序列時, SequenceAcknowledgement 且在相反序列上流動的應用程式訊息必須傳送至 ReplyToCreateSequence端點參考。

  • R1108:使用提供機制建立兩個對應序列時,[address]元素的 Endpoint Reference 子元素wsrm:AcksTo的屬性wsrm:Accept必須與CreateSequenceResponse的目的地 URICreateSequence逐字節匹配。

  • R1109:當使用 Offer 機制建立兩個對向序列時,由啟動器傳送的訊息和回應者對訊息的確認必須傳送至相同的端點參考。

    WCF 會使用 WS-Reliable 傳訊來建立啟動器與回應程式之間的可靠會話。 WCF 的 WS-Reliable 訊息傳遞實作可為單向、請求-回應和完整雙工訊息傳遞模式提供可靠的會話。 上的 WS-Reliable 傳訊 Offer 機制 CreateSequence/CreateSequenceResponse 可讓您建立兩個相互關聯的對應序列,並提供適合所有訊息端點的會話通訊協定。 因為 WCF 為這類會話提供安全性保證,包括會話完整性的端對端保護,所以確保目標為相同合作對象的訊息抵達相同目的地是可行的。 這也允許在應用程式訊息中附帶序列確認。 因此,R1104、R1105 和 R1108 條件約束會套用至 WCF。

CreateSequence 訊息範例。

<s:Envelope>
  <s:Header>
    <a:Action s:mustUnderstand="1">
      http://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequence
    </a:Action>
    <a:ReplyTo>
      <a:Address>
         http://Business456.com/clientA
      </a:Address>
    </a:ReplyTo>
    <a:MessageID>
      urn:uuid:addabbbf-60cb-44d3-8c5b-9e0841629a36
    </a:MessageID>
    <a:To s:mustUnderstand="1">
      http://Business456.com/clientA
    </a: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:0afb8d36-bf26-4776-b8cf-8c91fddb5496
      </wsrm:Identifier>
     </wsrm:Offer>
   </wsrm:CreateSequence>
  </s:Body>
</s:Envelope>

CreateSequenceResponse 訊息範例。

<s:Envelope>
  <s:Header>
    <a:Action s:mustUnderstand="1">
      http://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequenceResponse
    </a:Action>
    <a:RelatesTo>
      urn:uuid:addabbbf-60cb-44d3-8c5b-9e0841629a36
    </a:RelatesTo>
    <a:To s:mustUnderstand="1">
      http://Business456.com/clientA
    </a:To>
  </s:Header>
  <s:Body>
   <wsrm:CreateSequenceResponse>
    <Identifier>
     urn:uuid:eea0a36c-b38a-43e8-8c76-2fabe2d76386
    </Identifier>
    <Accept>
    <AcksTo>
      <a:Address>
        http://BusinessABC.com/serviceA
      </a:Address>
    </AcksTo>
    </Accept>
   </wsrm:CreateSequenceResponse>
  </s:Body>
</s:Envelope>

順序

以下是適用於序列的條件約束清單:

  • B1201:WCF 會產生並存取序號,其不超過 xs:long 的最大值(含),9223372036854775807。

  • B1202:WCF 一律會產生具有 動作 URI http://schemas.xmlsoap.org/ws/2005/02/rm/LastMessage的空白主體最後一則訊息。

  • B1203:WCF 會接收並傳送含有 LastMessage 元素的 Sequence 標頭訊息,只要動作 URI 不是 http://schemas.xmlsoap.org/ws/2005/02/rm/LastMessage

序列標頭的範例。

<wsrm:Sequence>
  <wsrm:Identifier>
    urn:uuid:addabbbf-60cb-44d3-8c5b-9e0841629a36
  </wsrm:Identifier>
  <wsrm:MessageNumber>
    10
  </wsrm:MessageNumber>
  <wsrm:LastMessage/>
 </wsrm:Sequence>

AckRequested 標頭

WCF 會使用 AckRequested 標頭作為 Keep-alive 機制。 WCF 不會產生選擇性 MessageNumber 專案。 當收到包含AckRequested元素的MessageNumber標頭訊息時,WCF會忽略MessageNumber元素的值,如下列範例所示。

<wsrm:AckRequested>
  <wsrm:Identifier>
    urn:uuid:addabbbf-60cb-44d3-8c5b-9e0841629a36
  </wsrm:Identifier>
</wsrm:AckRequested>

序列確認標頭

WCF 會在 WS-Reliable 傳訊中使用附載機制來確認提供的序列。

  • R1401:使用 Offer 機制建立兩個相反序列時, SequenceAcknowledgement 標頭可能會包含在傳送給預定收件者的任何應用程式訊息中。

  • B1402:當 WCF 在接收任何序列訊息之前產生通知時(例如,若要滿足 AckRequested 訊息),WCF 會產生 SequenceAcknowledgement 包含範圍 0-0 的標頭,如下列範例所示。

    <wsrm:SequenceAcknowledgement>
      <wsrm:Identifier>
        urn:uuid:addabbbf-60cb-44d3-8c5b-9e0841629a36
      </wsrm:Identifier>
      <wsrm:AcknowledgementRange Upper="0" Lower="0"/>
    </wsrm:SequenceAcknowledgement>
    
  • B1403:WCF 不產生包含 SequenceAcknowledgement 元素的 Nack 標頭,但支援 Nack 元素。

WS-ReliableMessaging 錯誤

以下是應用於 WCF 實作 WS-Reliable 訊息錯誤的限制清單:

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

  • B1502:WCF 端點可能會產生 CreateSequenceRefused 錯誤,如規格中所述。

  • B1503:當服務端點達到其連線限制且無法處理新連線時,WCF 會產生額外的 CreateSequenceRefused 錯誤子程式代碼, netrm:ConnectionLimitReached如下列範例所示。

    <s:Envelope>
      <s:Header>
        <wsa:Action>
          http://schemas.xmlsoap.org/ws/2005/08/addressing/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">
              [Reason]
            </s:Text>
          </s:Reason>
        </s:Fault>
      </s:Body>
    </s:Envelope>
    

WS-Addressing 錯誤

由於傳訊 WS-Reliable 使用 WS 尋址,因此 WCF WS-Reliable 傳訊實作可能會產生 WS-Addressing 錯誤。 本節涵蓋 WCF 在 WS-Reliable 傳訊層明確產生的 WS-Addressing 錯誤:

  • B1601:WCF 會在下列其中一項成立時產生錯誤訊息尋址標頭:

    • 訊息遺漏 Sequence 標頭和 Action 標頭。

    • CreateSequence訊息遺失MessageId標頭。

    • CreateSequence訊息遺失ReplyTo標頭。

  • B1602:當訊息遺漏 Sequence 標頭且具有無法在 WS-Reliable 傳訊規格中辨識的 Action 標頭時,WCF 會在回覆時產生錯誤狀態:不支援的動作。

  • B1603:WCF 會產生錯誤「端點不可用」,指出端點不會根據檢查 CreateSequence 訊息的尋址標頭來處理序列。

通訊協議組合

使用 WS-Addressing 進行創作

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

雖然 WS-Reliable 傳訊規格僅提到 WS-Addressing 2004/08,但不會限制可以使用的 WS-Addressing 版本。 以下是套用至 WCF 的條件約束清單:

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

  • R2102:在整個特定的 WS-Reliable 傳訊序列中,或在使用 wsrm:Offer 機制關聯的一對相反序列中,必須使用單一版本的 WS-Addressing。

使用SOAP進行組合

WCF 支援使用 SOAP 1.1 和 SOAP 1.2 搭配 WS-Reliable 傳訊。

與 WS-Security 和 WS-SecureConversation 的組合

WCF 透過使用安全傳輸 (HTTPS)、搭配 WS-Security 撰寫,以及搭配 WS-Secure Conversation 組合,為 WS-Reliable 傳訊序列提供保護。 以下是套用至 WCF 的條件約束清單:

  • R2301:為了保護 WS-Reliable 訊息的順序完整性,並且保障個別訊息的完整性及機密性,WCF 必須使用 WS-Secure 對話機制。

  • R2302:在建立 WS-Reliable 消息序列之前,必須先建立AWS-Secure 交談會話。

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

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

    WCF 來源會在 wsse:SecurityTokenReference 訊息的 CreateSequence 元素擴充性區段中產生 元素。

  • R2305:使用 WS-Secure Conversation 撰寫時, CreateSequence 訊息必須包含 wsse:SecurityTokenReference 元素。

WS-Reliable 傳訊 WS-Policy 斷言

WCF 會使用 WS-Reliable 訊息 WS-Policy 斷言 wsrm:RMAssertion 來描述端點功能。 以下是套用至 WCF 的條件約束清單:

  • B3001:WCF 會將 wsrm:RMAssertion WS-Policy 斷言附加至 wsdl:binding 元素。 WCF 支援同時附加到wsdl:bindingwsdl:port元素的附件。

  • B3002:WCF 支援 WS-Reliable 訊息斷言的下列選擇性屬性,並在 WCFReliableMessagingBindingElement 上提供控制:

    • wsrm:InactivityTimeout

    • wsrm:AcknowledgementInterval

    以下是範例。

    <wsrm:RMAssertion>
      <wsrm:InactivityTimeout Milliseconds="600000" />
      <wsrm:AcknowledgementInterval Milliseconds="200" />
    </wsrm:RMAssertion>
    

流量控制 WS-Reliable 訊息擴充元件

WCF 會使用 WS-Reliable 傳訊擴充性來提供選擇性的額外更嚴格控制時序訊息流程。

將屬性設定 ReliableSessionBindingElement.FlowControlEnabledtrue,以啟用流程控制。 以下是套用至 WCF 的條件約束清單:

  • B4001:啟用可靠消息流程控制時,WCF 會在 netrm:BufferRemaining 標頭的元素擴充性中產生一個 SequenceAcknowledgement 元素。

  • B4002:當啟用可靠的訊息流程控制時,WCF 不要求在標頭中出現 netrm:BufferRemaining 元素 SequenceAcknowledgement,如以下範例所示。

    <wsrm:SequenceAcknowledgement>
      <wsrm:Identifier>
        http://fabrikam123.com/abc
      </wsrm:Identifier>
      <wsrm:AcknowledgementRange Upper="1" Lower="1"/>
      <netrm:BufferRemaining>
        8
      </netrm:BufferRemaining>
    </wsrm:SequenceAcknowledgement>
    
  • B4003:WCF 會使用 netrm:BufferRemaining 來指出 Reliable Messaging Destination 可以緩衝處理多少新訊息。

  • B4004:當 Reliable Messaging 目的地應用程式無法快速接收訊息時,WCF Reliable Messaging Service 會限制傳輸的訊息數量。 Reliable Messaging 目的地會緩衝訊息,而元素的值會降至 0。

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

訊息交換模式

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

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

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

單向、不可尋址的啟動器

捆綁

WCF 透過一個 HTTP 通道使用一個序列,提供單向訊息交換模式。 WCF 會使用 HTTP 要求,將所有訊息從 RMS 傳輸至 RMD,而 HTTP 回應則會將所有訊息從 RMD 傳輸至 RMS。

CreateSequence Exchange

WCF 啟動器會產生不包含提供的訊息 CreateSequence。 WCF 回應程式可確保 CreateSequence 在建立序列之前沒有提議。 WCF 回應程式會以CreateSequence訊息回復CreateSequenceResponse要求。

序列確認

WCF 啟動器會處理除了 CreateSequence 訊息和錯誤訊息之外所有訊息的確認。 WCF 回應程式一律會在對序列和 AckRequested 訊息的回應中生成獨立的確認。

TerminateSequence 訊息

WCF 會將 TerminateSequence 視為單向作業,這表示 HTTP 回應具有空本文和 HTTP 202 狀態代碼。

單向可尋址啟動器

捆綁

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

CreateSequence Exchange

WCF 啟動器會產生不包含提供的訊息 CreateSequence。 WCF 回應器可確保在建立序列之前,CreateSequence 沒有任何提供。 WCF 回應程式會透過 HTTP 要求,使用端點參考來傳輸 CreateSequenceResponse 訊息。

雙工、可尋址啟動器

捆綁

WCF 使用兩個序列,透過輸入和輸出 HTTP 通道提供完全異步的雙向訊息交換模式。 WCF 會使用 HTTP 要求來傳輸所有訊息。 所有 HTTP 回應都有空白本文和 HTTP 202 狀態代碼。

CreateSequence Exchange

WCF 啟動器會產生具有 CreateSequence 提議的訊息。 WCF 回應程式可確保 CreateSequence 在建立序列之前,有一個提議。 WCF 會將 CreateSequenceResponse 發送到 HTTP 要求的 CreateSequenceReplyTo 端點參考。

序列壽命

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

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

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

Request-Reply、不可尋址的起始器

捆綁

WCF 透過一個 HTTP 通道使用兩個序列,提供單向和要求-回復訊息交換模式。 WCF 會使用 HTTP 要求來傳輸要求序列的訊息,並使用 HTTP 回應來傳輸回覆序列的訊息。

CreateSequence Exchange

WCF 啟動器會產生具有 CreateSequence 提議的訊息。 WCF 回應程式可確保 CreateSequence 在建立序列之前,有一個提議。 WCF 回應程式會以CreateSequence訊息回復CreateSequenceResponse要求。

單向訊息

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

WCF 回應者可以使用確認、錯誤,或具有空白正文和 HTTP 202 狀態碼的回應來回覆請求。

双向訊息

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

WCF 回應元件可以使用應用程式回覆、錯誤回覆或具有空白內容和 HTTP 202 狀態碼的回應來回應要求。

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

嘗試重新回覆

WCF 依賴 HTTP 要求-回復相互關聯來進行雙向訊息交換通訊協定相互關聯。 因此,WCF 啟動器不會在要求順序訊息被認可時停止重試,而是在 HTTP 回應中傳達認可、使用者訊息或錯誤時停止重試。 WCF 回應者會在與回復相關聯的 HTTP 要求階段上重試回復。

LastMessage Exchange

WCF 啟動器會在 HTTP 要求階段上產生並傳輸空白主體的最後一則訊息。 WCF 需要回應,但會忽略實際的回應訊息。 WCF 回應程式會回復要求序列的空白主體最後一則訊息,以及回復序列的空白主體最後一則訊息。

如果 WCF 回應程式收到動作 URI 不是 http://schemas.xmlsoap.org/ws/2005/02/rm/LastMessage的最後一則訊息,WCF 會以最後一則訊息回復。 在雙向訊息交換通訊協議的情況下,最後一則訊息會攜帶應用程式訊息;在單向訊息交換通訊協議的情況下,最後一則訊息是空的。

WCF 回應程式不需要對回復序列的空白主體最後一則訊息進行確認。

TerminateSequence Exchange

當所有要求都收到有效的回復時,WCF 啟動器會在 HTTP 要求回合上產生並傳輸要求序列的 TerminateSequence 訊息。 WCF 需要回應,但會忽略實際的回應訊息。 WCF 回應程式會以回復順序的 TerminateSequence 訊息回復要求序列的 TerminateSequence 訊息。

在正常的關機程序中,這兩個訊息都會傳送完整的範圍TerminateSequenceSequenceAcknowledgement

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

捆綁

WCF 透過輸入和輸出 HTTP 通道使用兩個序列來提供要求-回復訊息交換模式。 WCF 會使用 HTTP 要求來傳輸所有訊息。 所有 HTTP 回應都有空白本文和 HTTP 202 狀態代碼。

CreateSequence Exchange

WCF 啟動器會產生具有 CreateSequence 提議的訊息。 WCF 回應程式可確保 CreateSequence 在建立序列之前,有一個提議。 WCF 會將 CreateSequenceResponse 發送到 HTTP 要求的 CreateSequenceReplyTo 端點參考。

要求/回復相互關聯

WCF 啟動器可確保所有應用程式要求訊息都具有MessageIdReplyTo端點參考。 WCF 發起者會將訊息的 CreateSequence 端點參考套用在每個應用程式要求訊息上。 WCF 回應程式要求收到的請求訊息需附有 MessageIdReplyTo。 WCF 回應程式可確保端點參考的 URI CreateSequence 和所有應用程式要求訊息都相同。