可靠消息传送协议版本 1.1

本主题介绍使用 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 实现 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 仅使用DiscardFollowingFirstGap元素中的NoDiscardIncompleteSequenceBehavior值。

    • 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: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元素是否在所有CloseSequenceTerminateSequence消息中保持一致。 这意味着 LastMsgNumber 要么不存在于所有 CloseSequenceTerminateSequence 消息中,要么存在并且在所有 CloseSequenceTerminateSequence 消息中相同。

  • 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, CloseSequenceTerminateSequence消息缺少MessageId的标头。

    • CreateSequence, CloseSequenceTerminateSequence消息缺少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-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: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:启用 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:intmaxInclusive 值 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/ReplyAddressable 发起者消息交换模式混合使用。 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 确保传入请求消息具有MessageIdReplyTo

  • WCF 可确保 ReplyTo 终结点引用的所有应用程序请求消息的 URI 与前面定义的本地终结点引用匹配。

  • WCF 可确保所有答复都遵循请求/回复相关规则,并具有正确的RelatesToTo标头wsa