Reliable Messaging Protocol 1.0 版
本主題說明使用 HTTP 傳輸進行交互操作時所需 WS-ReliableMessaging 2005 年 2 月 (1.0 版) 通訊協定的 Windows Communication Foundation (WCF) 實作詳細資料。 WCF 遵循本主題所述 WS-ReliableMessaging 規格的條件約束及說明。 請注意,從 WinFX 開始會實作 WS-ReliableMessaging 1.0 版通訊協定。
WS-ReliableMessaging 2005 年 2 月通訊協定可透過 ReliableSessionBindingElement 在 WCF 中實作。
為了方便起見,本主題將使用下列角色:
啟動器:啟動 WS-Reliable 訊息序列建立作業的用戶端
回應程式:接收啟動器要求的服務
本文件會使用下表的前置詞和命名空間。
Prefix | 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
元素時,在Offer
元素中產生選擇性的Expires
元素。B1102:存取
CreateSequence
訊息時,WCFResponder
會傳送和接收這兩個Expires
元素 (如果兩者都存在的話),但不會使用其值。
WS-Reliable 訊息會使用 Offer
機制來建立兩個反向關聯序列以形成工作階段。
R1103:如果
CreateSequence
包含Offer
項目,則可信賴傳訊回應程式必須接收序列並以包含CreateSequenceResponse
項目的wsrm:Accept
來回應,以形成兩個相互關聯的反向序列,或是拒絕CreateSequence
要求。R1104:流經反向序列的
SequenceAcknowledgement
和應用程式訊息必須傳送到ReplyTo
的CreateSequence
端點參考。R1105:
AcksTo
中的ReplyTo
和CreateSequence
端點參考必須具有位址值以符合八位元規格。WCF 回應端會在建立序列之前,先驗證
AcksTo
和ReplyTo
EPR 的 URI 部分相同。R1106:
AcksTo
訊息中的ReplyTo
和CreateSequence
端點參照應該具有相同的參照參數集合。WCF 不會強制執行,但會假定
CreateSequence
上AcksTo
和ReplyTo
的[傳址參數]相同,並針對認可和對話序列訊息使用來自ReplyTo
端點參考的[傳址參數]。R1107:當兩個反向序列都是透過
Offer
機制建立時,流經反向序列的SequenceAcknowledgement
和應用程式訊息必須傳送至ReplyTo
的CreateSequence
端點參考。R1108:當兩個反向序列都透過 Offer 機制建立時,
[address]
端點參考子項目 (屬於wsrm:AcksTo
的wsrm:Accept
項目) 的CreateSequenceResponse
屬性必須符合CreateSequence
的目的地 URI 的位元組規格。R1109:當兩個反向序列都是透過
Offer
機制建立時,從啟動器傳送的訊息以及透過回應程式對訊息的認可,必須傳送至相同的端點參考。WCF 使用 WS-ReliableMessaging 在起始端與回應端之間建立可靠工作階段。 WCF 的 WS-ReliableMessaging 實作會為單向、要求-回覆與全雙面傳訊模式提供可靠工作階段。
CreateSequence
/CreateSequenceResponse
上的 WS-ReliableMessagingOffer
機制可讓您建立兩個相互關聯的對話序列,並提供適用於所有訊息端點的工作階段通訊協定。 由於 WCF 會為這類工作階段提供安全性保證 (包括工作階段完整性的端對端保護),因此可以確保傳給同一方的訊息都會送達相同目的地。 這麼做也可以針對應用程式訊息進行 Piggy-Backing 的序列認可作業。 因此,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 一律會使用
http://schemas.xmlsoap.org/ws/2005/02/rm/LastMessage
的動作 URI 來產生本文空白的最後一則訊息。B1203:只要動作 URI 不是
http://schemas.xmlsoap.org/ws/2005/02/rm/LastMessage
,WCF 就會透過包含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
標頭作為保持運作機制。 WCF 不會產生選擇性的 MessageNumber
元素。 在透過包含 MessageNumber
元素的 AckRequested
標頭接收訊息時,WCF 會忽略 MessageNumber
元素的值,如下列範例所示。
<wsrm:AckRequested>
<wsrm:Identifier>
urn:uuid:addabbbf-60cb-44d3-8c5b-9e0841629a36
</wsrm:Identifier>
</wsrm:AckRequested>
SequenceAcknowledgement 標頭
WCF 會使用 WS-ReliableMessaging 中所提供的序列認可附掛式機制。
R1401:當兩個反向序列透過
Offer
機制建立時,SequenceAcknowledgement
標頭可以包含在任何傳送至目的收件者的應用程式訊息中。B1402:當 WCF 必須在接收任何序列訊息之前先產生認可時 (例如為了滿足
AckRequested
訊息),WCF 會產生包含範圍 0-0 的SequenceAcknowledgement
標頭,如下列範例所示。<wsrm:SequenceAcknowledgement> <wsrm:Identifier> urn:uuid:addabbbf-60cb-44d3-8c5b-9e0841629a36 </wsrm:Identifier> <wsrm:AcknowledgementRange Upper="0" Lower="0"/> </wsrm:SequenceAcknowledgement>
B1403:WCF 不會產生包含
Nack
元素的SequenceAcknowledgement
標頭,但支援Nack
元素。
WS-ReliableMessaging 錯誤
以下列出 WCF 實作 WS-ReliableMessaging 錯誤時適用的條件約束:
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-ReliableMessaging 使用 WS-Addressing,WCF WS-ReliableMessaging 實作可能會產生 WS-Addressing 錯誤。 本節說明 WCF 在 WS-ReliableMessaging 層明確產生的 WS-Addressing 錯誤:
B1601:當下列任一情況發生時,WCF 會產生「需要訊息定址標頭」錯誤:
訊息缺少
Sequence
標頭和Action
標頭。CreateSequence
訊息缺少MessageId
標頭。CreateSequence
訊息缺少ReplyTo
標頭。
B1602:WCF 會產生「不支援的動作」錯誤以回應訊息 (此訊息缺少
Sequence
標頭並具有 WS-ReliableMessaging 規格無法識別的Action
標頭)。B1603:WCF 會產生「端點無法使用」錯誤,表示端點不會根據
CreateSequence
訊息的定址標頭檢查結果來處理序列。
通訊協定組合
與 WS-Addressing 組合
WCF 支援兩種版本的 WS-Addressing: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-Addressing 必須透過
wsrm:Offer
機制,用在整個指定的 WS-ReliableMessaging 序列或是一對相關聯的對話序列上。
與 SOAP 組合
WCF 同時支援 SOAP 1.1 和 SOAP 1.2 搭配 WS-ReliableMessaging 一起使用。
與 WS-Security 和 WS-SecureConversation 組合
WCF 透過使用安全傳輸 (HTTPS)、與 Web 服務安全性組合,以及與 WS-SecureConversation 組合,為 WS-ReliableMessaging 序列提供保護。 以下列出適用於 WCF 的條件約束:
R2301:除了保護個別訊息的完整性與機密性,為了兼顧 WS-ReliableMessaging 序列的完整性,WCF 要求必須使用 WS-SecureConversation。
R2302:在建立 WS-Reliable 訊息序列之前,必須先建立 AWS-Secure Conversation 工作階段。
R2303:如果 WS-Reliable 訊息序列的存留期超過 WS-Secure Conversation 工作階段的存留期,則使用 WS-Secure Conversation 建立的
SecurityContextToken
必須透過對應的 WS-Secure Conversation 更新繫結來加以更新。B2304:WS-Reliable 訊息序列或是一對相互關聯的反向序列一律繫結至單一 WS-SecureConversation 工作階段。
WCF 來源會在
CreateSequence
訊息的元素擴充性區段中產生wsse:SecurityTokenReference
元素。R2305:與 WS-SecureConversation 組合時,
CreateSequence
訊息必須包含wsse:SecurityTokenReference
元素。
WS-Reliable 訊息 WS-Policy 判斷提示
WCF 使用 WS-ReliableMessaging WS-Policy 判斷提示 wsrm:RMAssertion
來描述端點功能。 以下列出適用於 WCF 的條件約束:
B3001:WCF 會將
wsrm:RMAssertion
WS-Policy 判斷提示附加至wsdl:binding
元素。 WCF 支援附加至wsdl:binding
和wsdl:port
元素。B3002:WCF 支援 WS-ReliableMessaging 判斷提示的下列選擇性屬性,並在 WCF
ReliableMessagingBindingElement
提供對這些屬性的控制:wsrm:InactivityTimeout
wsrm:AcknowledgementInterval
以下是一個範例。
<wsrm:RMAssertion> <wsrm:InactivityTimeout Milliseconds="600000" /> <wsrm:AcknowledgementInterval Milliseconds="200" /> </wsrm:RMAssertion>
WS-Reliable 訊息延伸的流量控制
WCF 使用 WS-ReliableMessaging 擴充性,針對序列訊息流程提供其他更嚴格的選擇性控制。
將 ReliableSessionBindingElement.FlowControlEnabled 屬性設定為 true
,即可啟用流程控制。 以下列出適用於 WCF 的條件約束:
B4001:啟用可靠傳訊流程控制時,WCF 會在
SequenceAcknowledgement
標頭的元素擴充性中產生netrm:BufferRemaining
元素。B4002:啟用可靠傳訊流程控制時,WCF 不會要求
SequenceAcknowledgement
標頭中一定要有netrm:BufferRemaining
元素,如下列範例所示。<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
指出可靠傳訊目的地可以緩衝處理的新訊息數目。B4004:WCF 可靠傳訊服務會在可靠傳訊目的地應用程式無法快速接收訊息時,對傳送的訊息數目進行節流。 可信賴傳訊目的地會緩衝處理訊息,並讓項目值降為 0。
B4005:WCF 會產生介於 0 到 4096 (含此值) 之間的
netrm:BufferRemaining
整數值,並讀取介於 0 到xs:int
的maxInclusive
值 214748364 (含此值) 之間的整數值。
訊息交換模式
本節描述 WCF 在不同訊息交換模式下使用 WS-ReliableMessaging 時的行為。 在每個訊息交換模式中,會考慮下列兩種部署案例:
不可定址的啟動器:啟動器位於防火牆後方,回應程式只能透過 HTTP 回應將訊息傳送至啟動器。
可定址的啟動器:可將 HTTP 要求同時傳送給啟動器與回應程式,亦即可建立兩個反向 HTTP 連線。
單向、不可定址啟動器
繫結
WCF 透過在一個 HTTP 通道上使用一個序列的方式,提供單向的訊息交換模式。 WCF 會使用 HTTP 要求將所有訊息從 RMS 傳送至 RMD,並使用 HTTP 回應將所有訊息從 RMD 傳送至 RMS。
CreateSequence 交換
WCF 起始端會產生不含供應項目的 CreateSequence
訊息。 WCF 回應端會在建立序列之前,確保 CreateSequence
不含供應項目。 WCF 回應端會以 CreateSequenceResponse
訊息來回覆 CreateSequence
要求。
SequenceAcknowledgement
WCF 起始端會處理所有訊息 (CreateSequence
訊息與錯誤訊息除外) 回覆的認可。 WCF 回應端一律會產生獨立認可,以同時回應序列和 AckRequested
訊息。
TerminateSequence 訊息
WCF 會將 TerminateSequence
視為單向作業,表示 HTTP 回應內含空白本文與 HTTP 202 狀態碼。
單向、可定址啟動器
繫結
WCF 透過在輸入與輸出 HTTP 通道上使用一個序列的方式,提供單向訊息交換模式。 WCF 會使用 HTTP 要求傳送所有訊息。 所有的 HTTP 回應都有空本文和 HTTP 202 狀態碼。
CreateSequence 交換
WCF 起始端會產生不含供應項目的 CreateSequence
訊息。 WCF 回應端會在建立序列之前,確保 CreateSequence
不含供應項目。 WCF 回應端會透過 ReplyTo
端點參考所定址的 HTTP 要求來傳送 CreateSequenceResponse
訊息。
雙工、可定址啟動器
繫結
WCF 透過在輸入與輸出 HTTP 通道上使用兩個序列的方式,提供完全非同步的雙向訊息交換模式。 WCF 會使用 HTTP 要求傳送所有訊息。 所有的 HTTP 回應都有空本文和 HTTP 202 狀態碼。
CreateSequence 交換
WCF 起始端會產生不含供應項目的 CreateSequence
訊息。 WCF 回應端會在建立序列之前,確保 CreateSequence
不含供應項目。 WCF 會透過定址為 CreateSequence
之 ReplyTo
端點參考的 HTTP 要求來傳送 CreateSequenceResponse
。
序列存留期
WCF 會將兩個序列視為一個全雙面工作階段。
在產生將某個序列視為出錯的錯誤時,WCF 預期遠端端點會同時將兩個序列視為出錯。 在讀取將某個序列視為出錯的錯誤時,WCF 會同時將兩個序列視為出錯。
WCF 可關閉其輸出序列,並繼續處理其輸入序列上的訊息。 反之,WCF 可處理輸入序列的關閉作業,並繼續傳送其輸出序列上的訊息。
要求-回覆、不可定址啟動器
繫結
WCF 透過在一個 HTTP 通道上使用兩個序列的方式,提供單向和要求-回覆訊息交換模式。 WCF 會使用 HTTP 要求來傳送要求序列的訊息,並使用 HTTP 回應來傳送回覆序列的訊息。
CreateSequence 交換
WCF 起始端會產生不含供應項目的 CreateSequence
訊息。 WCF 回應端會在建立序列之前,確保 CreateSequence
不含供應項目。 WCF 回應端會以 CreateSequenceResponse
訊息來回覆 CreateSequence
要求。
單向訊息
為了成功完成單向訊息交換通訊協定,WCF 起始端會透過 HTTP 要求傳送要求序列訊息,並透過 HTTP 回應接收獨立的 SequenceAcknowledgement
訊息。 SequenceAcknowledgement
必須認可傳送的訊息。
WCF 回應端可透過認可、錯誤或是內含空白本文與 HTTP 202 狀態碼的回應來回覆要求。
雙向訊息
為了成功完成雙向訊息交換通訊協定,WCF 起始端會透過 HTTP 要求傳送要求序列訊息,並透過 HTTP 回應接收回覆序列訊息。 回應中必須包含認可傳輸之要求序列訊息的 SequenceAcknowledgement
。
WCF 回應端可透過應用程式回覆、錯誤或是內含空白本文與 HTTP 202 狀態碼的回應來回覆要求。
由於單向訊息與應用程式回覆時機的緣故,要求序列訊息的序號與回應訊息的序號彼此並未互相關聯。
重試回覆
WCF 需依賴 HTTP 要求-回覆相互關聯來執行雙向訊息交換通訊協定的相互關聯。 因此,WCF 起始端不會在認可要求序列訊息時停止重試要求序列訊息,而會在 HTTP 回應內含認可、使用者訊息,或是錯誤時,才停止重試要求序列訊息。 WCF 回應端會在與回覆相互關聯之要求的 HTTP 要求階段上重試回覆。
LastMessage 交換
WCF 起始端會在 HTTP 要求階段上產生及傳送本文空白的最後一則訊息。 WCF 需要回應,但會忽略實際的回應訊息。 WCF 回應端會透過回覆序列中本文空白的最後一則訊息,回覆要求序列中本文空白的最後一則訊息。
如果 WCF 回應端收到的最後一則訊息所包含的動作 URI 不是 http://schemas.xmlsoap.org/ws/2005/02/rm/LastMessage
,則 WCF 會透過最後一則訊息來回覆。 在雙向訊息交換通訊協定的情況中,最後一則訊息包含應用程式訊息;在單向訊息交換通訊協定的情況中,最後一則訊息包含空白主體。
WCF 回應端不會要求針對回覆序列中本文空白的最後一則訊息進行認可。
TerminateSequence 交換
當所有要求都收到有效回覆之後,WCF 起始端會在 HTTP 要求階段上產生及傳送要求序列的 TerminateSequence
訊息。 WCF 需要回應,但會忽略實際的回應訊息。 WCF 回應端會透過回覆序列的 TerminateSequence
訊息,回覆要求序列的 TerminateSequence
訊息。
在正常的關機序列中,兩個 TerminateSequence
訊息會同時包含完整範圍的 SequenceAcknowledgement
。
要求/回覆、可定址啟動器
繫結
WCF 透過在輸入與輸出 HTTP 通道上使用兩個序列的方式,提供要求-回覆訊息交換模式。 WCF 會使用 HTTP 要求傳送所有訊息。 所有的 HTTP 回應都有空本文和 HTTP 202 狀態碼。
CreateSequence 交換
WCF 起始端會產生不含供應項目的 CreateSequence
訊息。 WCF 回應端會在建立序列之前,確保 CreateSequence
不含供應項目。 WCF 會透過定址為 CreateSequence
之 ReplyTo
端點參考的 HTTP 要求來傳送 CreateSequenceResponse
。
要求/回覆相互關聯
WCF 起始端會確保所有應用程式要求訊息都帶有 MessageId
和 ReplyTo
端點參考。 WCF 啟動器會將 CreateSequence
訊息的 ReplyTo
端點參考套用至每個應用程式要求訊息。 WCF 回應端會要求傳入要求訊息帶有 MessageId
和 ReplyTo
。 WCF 回應端會確保 CreateSequence
和所有應用程式要求訊息的端點參考 URI 相同。