本主题介绍使用 HTTP 传输进行互操作所需的 WS-ReliableMessaging 2007 年 2 月(版本 1.1)协议的 Windows Communication Foundation (WCF) 实现细节。 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 实现 CreateSequence
和 CreateSequenceResponse
消息以建立可靠的消息传送序列。 以下约束适用:
B1101:WCF 发起方与
CreateSequence
消息的ReplyTo
、AcksTo
和Offer/Endpoint
使用相同的终结点引用。R1102:
AcksTo
消息中的ReplyTo
、Offer/Endpoint
和CreateSequence
终结点引用必须具有包含相同字符串表示的地址值,以便它们与八进制形式匹配。- WCF 响应程序在创建序列之前验证终结点引用的
AcksTo
ReplyTo
Endpoint
URI 部分是否相同。
- WCF 响应程序在创建序列之前验证终结点引用的
R1103:
AcksTo
消息中的ReplyTo
、Offer/Endpoint
和CreateSequence
终结点引用应具有相同的引用参数集。- WCF 不强制执行,但假定
AcksTo
、ReplyTo
和Offer/Endpoint
的终结点引用参数是相同的,并且使用CreateSequence
中的终结点引用参数来进行确认和相反序列消息。
- WCF 不强制执行,但假定
B1104:WCF 发起程序在
Expires
消息中不会生成可选的Offer/Expires
或CreateSequence
元素。B1105:访问
CreateSequence
消息时,WCF 响应程序使用Expires
元素中的CreateSequence
值作为Expires
元素中的CreateSequenceResponse
值。 否则,WCF 响应程序读取并忽略Expires
和Offer/Expires
值。B1106:访问
CreateSequenceResponse
消息时,WCF 发起程序将读取可选Expires
值,但不使用它。B1107:WCF 启动方和响应方始终在元素
IncompleteSequenceBehavior
和CreateSequence/Offer
中生成可选的CreateSequenceResponse
元素。B1108:WCF 仅使用
DiscardFollowingFirstGap
元素中的NoDiscard
和IncompleteSequenceBehavior
值。- WS-ReliableMessaging 利用
Offer
机制建立构成会话的两个相反的相关序列。
- WS-ReliableMessaging 利用
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 实现为单向、请求-答复和全双工消息模式提供了可靠的会话。
Offer
和 CreateSequence
上的 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 将 CloseSequence
和 CloseSequenceResponse
消息用于可靠消息源启动的关闭。 WCF 可靠消息传递目标不会发起关闭,WCF 可靠消息传递源不支持由可靠消息传递目标发起的关闭。 以下约束适用:
B1201:WCF 可靠消息传递源总是发送消息
CloseSequence
来终止序列。B1202:可靠消息源在发送
CloseSequence
消息之前,等待确认全部的序列消息。B1203:Reliable Messaging 源始终包含可选
LastMsgNumber
元素,除非序列不包含消息。R1204:可靠消息目标不得通过发送
CloseSequence
消息启动关闭。B1205:收到
CloseSequence
消息后,WCF Reliable Messaging 源会考虑序列不完整并发送错误。
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>
序列终止
在完成 TerminateSequence/TerminateSequenceResponse
握手后 WCF 主要使用 CloseSequence/CloseSequenceResponse
握手。 WCF 可靠消息目标不启动终止,且可靠消息源不支持可靠消息目标启动的终止。 以下约束适用:
B1301:在成功完成
TerminateSequence
握手后,WCF 发起方仅发送CloseSequence/CloseSequenceResponse
消息。R1302:WCF 验证在给定序列中,
LastMsgNumber
元素是否在所有CloseSequence
和TerminateSequence
消息中保持一致。 这意味着LastMsgNumber
要么不存在于所有CloseSequence
和TerminateSequence
消息中,要么存在并且在所有CloseSequence
和TerminateSequence
消息中相同。B1303:在
TerminateSequence
握手后收到CloseSequence/CloseSequenceResponse
消息时,可靠消息目标通过TerminateSequenceResponse
消息进行响应。 由于可靠消息传递源在发送TerminateSequence
消息之前获得最终确认,因此可靠消息传递目的地明确知道序列结束,并立即回收资源。B1304:在
TerminateSequence
握手之前收到CloseSequence/CloseSequenceResponse
消息时,WCF 可靠消息目标通过TerminateSequenceResponse
消息进行响应。 如果 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>
SequenceAcknowledgement
WCF 将“非法携带”机制用于在 WS-Reliable Messaging 中提供的序列确认。 以下约束适用:
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 错误
下面是适用于 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 寻址,因此 WCF WS-ReliableMessaging 实现可能会生成和传输 WS-Addressing 错误。 本节介绍 WCF 在 WS-ReliableMessaging 层上显式生成并传输的 WS-Addressing 错误:
B1801:WCF 在以下任一项为 true 时生成并传输
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 寻址: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-ReliableMessaging 序列或通过使用
Offer
机制关联的一对相反序列中,必须使用 WS-Addressing 的单个版本。
与 SOAP 组合
WCF 支持将 SOAP 1.1 和 SOAP 1.2 与 WS-Reliable 消息传送配合使用。
与 WS-Security 和 WS-SecureConversation 组合
WCF 通过使用安全传输(HTTPS)、与 WS-Security 的组合以及与 WS-Secure 会话的组合,为 WS-ReliableMessaging 序列提供保护。 WS-ReliableMessaging 1.1 协议、WS-Security 1.1 和 WS-Secure 对话 1.3 协议应一起使用。 下面是适用于 WCF 的约束列表:
R2301:除了单个消息的完整性和机密性外,为了保护 WS-ReliableMessaging 序列的完整性,WCF 要求使用 WS-Secure 对话。
R2302:必须在建立 WS-ReliableMessaging 序列之前建立 WS-Secure Conversation 会话。
R2303:如果 WS-ReliableMessaging 序列生存期超过了 WS-Secure Conversation 会话的生存期,则必须通过使用对应的 WS-Secure Conversation 续订绑定来续订通过使用 WS-Secure Conversation 建立的
SecurityContextToken
。B2304:WS-ReliableMessaging 序列或一对相关的相反序列始终绑定到单个 WS-SecureConversation 会话。
R2305:使用 WS-Secure 对话撰写时,WCF 响应程序要求
CreateSequence
消息包含wsse:SecurityTokenReference
元素和wsrm:UsesSequenceSTR
标头。
UsesSequenceSTR
标头的一个示例。
<wsrm:UsesSequenceSTR></wsrm:UsesSequenceSTR>
与 SSL/TLS 会话组合
WCF 不支持与 SSL/TLS 会话组合:
B2401:WCF 不生成
wsrm:UsesSequenceSSL
标头。R2402:可靠消息发起方不得将包含
CreateSequence
标头的wsrm:UsesSequenceSSL
消息发送到 WCF 响应方。
与 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: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.FlowControlEnabledtrue
.,启用流控制。 下面是适用于 WCF 的约束列表:
B4001:启用 Reliable Messaging Flow Control 后,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:启用 Reliable Messaging Flow Control 时,WCF Reliable Messaging Source 使用值
netrm:BufferRemaining
来限制消息传输。B4005:WCF 生成介于 0 和 4096(包括这两个值)之间的
netrm:BufferRemaining
整数值,并读取介于 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 响应。
SequenceAcknowledgement
WCF 发起方处理除 CreateSequence
消息和错误消息之外的所有消息答复的确认消息。 WCF 响应方始终将 HTTP 响应上的独立确认传输到所有序列和 AckRequested
消息。
CloseSequence 交换
WCF 发起程序通过 HTTP 请求传输 CloseSequence
消息,并期望在 HTTP 响应上接收 CreateSequenceResponse
消息。 WCF 响应程序在 HTTP 响应上传输 CloseSequenceResponse
消息。
TerminateSequence 交换
WCF 发起程序通过 HTTP 请求传输 TerminateSequence
消息,并期望在 HTTP 响应上接收 TerminateSequenceResponse
消息。 WCF 响应程序在 HTTP 响应上传输 TerminateSequenceResponse
消息。
单向、可寻址的发起方
捆绑
WCF 通过一个入站和一个出站 HTTP 通道使用一个序列提供单向消息交换模式。 WCF 使用 HTTP 请求传输所有消息。 所有 HTTP 响应都具有空正文和 HTTP 202 状态代码。
CreateSequence Exchange
WCF 发起者在 HTTP 请求中传输没有 CreateSequence
元素的 Offer
消息。 WCF 响应程序创建一个序列,并在 HTTP 请求中传输不包含 CreateSequenceResponse
元素的 Accept
消息。
双工、可寻址的发起方
捆绑
WCF 通过一个入站和一个出站 HTTP 信道,以两个序列提供全异步的双向消息传递模式。 此消息交换模式可以在有限的方式下与 Request/Reply
、Addressable
发起者消息交换模式混合使用。 WCF 使用 HTTP 请求传输所有消息。 所有 HTTP 响应都具有空正文和 HTTP 202 状态代码。
CreateSequence Exchange
WCF 发起方在 HTTP 请求上传输具有 CreateSequence
元素的 Offer
消息。 WCF 响应程序确保 CreateSequence
包含 Offer
元素,然后创建一个序列,并通过包含 CreateSequenceResponse
元素传输 Accept
消息。
序列生命周期
WCF 将两个序列视为一个完整的双向会话。
在某个序列出现故障时,WCF 预期远程终结点会使这两个序列同时出现故障。 当读取导致某个序列故障的错误时,WCF 会使两个序列都故障。
WCF 可以关闭其出站序列并继续处理其入站序列上的消息。 相反,WCF 可以处理入站序列的关闭,并继续在其出站序列上发送消息。
请求-答复和单向、不可寻址的发起方
捆绑
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 交换
在接收到所有答复序列消息和所有单向请求序列消息的确认后,WCF 发起程序通过 HTTP 请求发送一个用于请求序列的 CloseSequence
消息,并期望在 HTTP 响应中收到 CloseSequenceResponse
。
关闭请求序列会隐式关闭回复序列。 这意味着 WCF 发起方在 SequenceAcknowledgement
消息上包括答复序列的最终 CloseSequence
,且答复序列没有 CloseSequence
交换。
WCF 响应程序可确保确认所有答复,并在 HTTP 响应上传输 CloseSequenceResponse
消息。
TerminateSequence 交换
收到 CloseSequenceResponse
消息后,WCF 启动程序在 HTTP 请求上为该请求序列传输 TerminateSequence
消息,并期望在 HTTP 响应中收到 TerminateSequenceResponse
。
与CloseSequence
交换一样,终止请求序列会隐式地终止回复序列。 这意味着 WCF 发起方在 SequenceAcknowledgement
消息上包括答复序列的最终 TerminateSequence
,且答复序列没有 TerminateSequence
交换。
WCF 响应程序在 HTTP 响应上传输 TerminateSequenceResponse
消息。
请求/答复、可寻址的发起方
捆绑
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 确保传入请求消息具有
MessageId
和ReplyTo
。WCF 可确保
ReplyTo
终结点引用的所有应用程序请求消息的 URI 与前面定义的本地终结点引用匹配。WCF 可确保所有答复都遵循请求/回复相关规则,并具有正确的
RelatesTo
To
标头wsa
。