本主題涵蓋 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 會實作 CreateSequence 和 CreateSequenceResponse 訊息,以建立可靠的訊息順序。 適用下列條件約束:
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和反向序列中流動的應用程式訊息必須被傳送至ReplyTo的CreateSequence端點參考。R1105:
AcksTo和ReplyTo中的CreateSequence端點參考的位址值必須逐字節完全匹配。WCF 回應程式會在建立序列之前,確認
AcksTo和ReplyToEPR 的 URI 部分是否相同。R1106:
AcksTo和ReplyTo中的CreateSequence端點參考應該具有相同的參考參數集。WCF 不會強制執行,但假設
AcksTo上的ReplyTo和CreateSequence的 [參考參數] 是相同的,並使用ReplyTo端點參考中的 [參考參數] 進行認可和回應序列訊息。R1107:當使用
Offer機制建立兩個相反序列時,SequenceAcknowledgement且在相反序列上流動的應用程式訊息必須傳送至ReplyTo的CreateSequence端點參考。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:RMAssertionWS-Policy 斷言附加至wsdl:binding元素。 WCF 支援同時附加到wsdl:binding和wsdl:port元素的附件。B3002:WCF 支援 WS-Reliable 訊息斷言的下列選擇性屬性,並在 WCF
ReliableMessagingBindingElement上提供控制:wsrm:InactivityTimeoutwsrm:AcknowledgementInterval
以下是範例。
<wsrm:RMAssertion> <wsrm:InactivityTimeout Milliseconds="600000" /> <wsrm:AcknowledgementInterval Milliseconds="200" /> </wsrm:RMAssertion>
流量控制 WS-Reliable 訊息擴充元件
WCF 會使用 WS-Reliable 傳訊擴充性來提供選擇性的額外更嚴格控制時序訊息流程。
將屬性設定 ReliableSessionBindingElement.FlowControlEnabled 為 true,以啟用流程控制。 以下是套用至 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 要求的 CreateSequence 的 ReplyTo 端點參考。
序列壽命
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 要求的 CreateSequence 的 ReplyTo 端點參考。
要求/回復相互關聯
WCF 啟動器可確保所有應用程式要求訊息都具有MessageId和ReplyTo端點參考。 WCF 發起者會將訊息的 CreateSequence 端點參考套用在每個應用程式要求訊息上。 WCF 回應程式要求收到的請求訊息需附有 MessageId 和 ReplyTo。 WCF 回應程式可確保端點參考的 URI CreateSequence 和所有應用程式要求訊息都相同。