上下文交换协议

本部分介绍 Windows Communication Foundation (WCF) 版本 3.5 中引入的上下文交换协议。 此协议允许客户端通道接受服务提供的上下文,并将其应用于通过同一客户端通道实例发送的该服务的所有后续请求。 上下文交换协议的实现可以使用以下两种机制之一在服务器和客户端之间传播上下文:HTTP Cookie 或 SOAP 标头。

上下文交换协议在自定义通道层中实现。 通道使用ContextMessageProperty属性在应用程序层之间传递上下文。 对于终结点之间的传输,上下文的值或者在通道层序列化为 SOAP 标头,或者在表示 HTTP 请求和响应的消息属性之间来回转换。 在后一种情况下,应有一个基础通道层将 HTTP 请求和响应消息属性分别与 HTTP Cookie 来回进行转换。 用于交换上下文的机制的选择通过 ContextExchangeMechanism 的属性在 ContextBindingElement 上进行。 有效值为 HttpCookieSoapHeader

在客户端上,通道的实例可以根据通道属性 Enabled上的设置在两种模式下运行。

模式 1:通道上下文管理

这是默认模式,其中Enabled被设置为true。 在此模式下,上下文通道管理上下文并在其生存期内缓存上下文。 可以通过调用IContextManager方法从通道属性GetContext检索上下文。 还可以通过在通道属性上调用 SetContext 方法,在打开通道之前使用特定上下文预初始化通道。 在使用上下文初始化通道之后,将不能重置通道。

下面是此模式下不变量的列表:

  • 打开通道后,任何试图使用SetContext重置上下文的尝试都会引发InvalidOperationException

  • 任何试图在传出消息中使用 ContextMessageProperty 来发送上下文的操作都会引发 InvalidOperationException

  • 如果从具有特定上下文的服务器接收消息,则当通道已使用特定上下文进行初始化时,这将导致一个 ProtocolException

    注释

    仅在打开通道时没有显式设置任何上下文的情况下,从服务器上接收初始上下文才是合适的。

  • 传入消息中的ContextMessageProperty始终为null。

模式 2:应用程序上下文管理

这是当Enabled设置为false时的模式。 在此模式下,上下文通道不管理上下文。 应用程序负责通过使用 ContextMessageProperty 检索、管理和应用上下文。 任何尝试调用GetContextSetContext都会导致InvalidOperationException

无论选择哪种模式,客户端通道工厂都支持IRequestChannelIRequestSessionChannelIDuplexSessionChannel消息交换模式。

在服务上,通道的实例负责将客户端在传入消息中提供的上下文转换为 ContextMessageProperty。 然后,应用程序层或其他通道可以在调用堆栈中进一步访问消息属性。 服务通道还允许应用程序层指定一个新上下文值,并通过在响应消息中附加ContextMessageProperty来传播回客户端。 此属性将转换为包含上下文的 SOAP 标头或 HTTP Cookie,具体取决于绑定的配置。 服务通道侦听器支持IReplyChannelIReplySessionChannelIReplySessionChannel消息交换模式。

上下文交换协议引入了一个新的 wsc:Context SOAP 标头,用于表示 HTTP Cookie 不用于传播上下文时的上下文信息。 上下文标头架构允许任意数量的子元素,每个元素都有一个字符串键和字符串内容。 下面是上下文标头的示例。

<Context xmlns="http://schemas.microsoft.com/ws/2006/05/context">

<property name="myContext">context-2</property>

</Context>

HttpCookie 模式下,使用 SetCookie HTTP 标头来设置 Cookie。 Cookie 名称为 WscContext. Cookie 的值是标头的 wsc:Context Base64 编码。 此值包含在引号中。

在传输过程中必须保护上下文的值,使之不会被修改,其原因与保护 WS-Addressing 标头的原因相同(标头可用于确定在将请求调度到服务上的何处)。 wsc:Context因此,当绑定提供消息保护功能时,需要在 SOAP 或传输级别对标头进行数字签名或签名和加密。 当 HTTP Cookie 用于传播上下文时,应使用传输安全性保护它们。

需要支持上下文交换协议的服务终结点可以在发布的策略中明确显示。 引入了两个新的策略断言,表示客户端在 SOAP 级别支持上下文交换协议或启用 HTTP Cookie 支持的要求。 由 ContextExchangeMechanism 属性控制如何将这些断言生成到服务策略中,如下所示:

  • 对于 ContextSoapHeader,将生成以下断言:

    <IncludeContext
    xmlns="http://schemas.microsoft.com/ws/2006/05/context"  
    protectionLevel="Sign" />  
    
  • 对于 HttpCookie,将生成以下断言:

    <HttpUseCookie xmlns="http://schemas.xmlsoap.org/soap/http"/>  
    

另请参阅