“普通旧 XML”(POX)应用程序通过交换仅包含未包含在 SOAP 信封中的 XML 应用程序数据的原始 HTTP 消息进行通信。 Windows Communication Foundation (WCF)可以提供使用 POX 消息的服务和客户端。 在服务上,WCF 可用于实现向客户端公开终结点的服务,例如 Web 浏览器和发送和接收 POX 消息的脚本语言。 在客户端上,WCF 编程模型可用于实现与基于 POX 的服务通信的客户端。
注释
本文档最初是针对 .NET Framework 3.0 编写的。 .NET Framework 3.5 具有对使用 POX 应用程序的内置支持。 有关详细信息,请参阅 WCF Web HTTP 编程模型。
使用 WCF 进行 POX 编程
使用 POX 消息通过 HTTP 进行通信的 WCF 服务使用 <customBinding>。
<customBinding>
<binding name="poxServerBinding">
<textMessageEncoding messageVersion="None" />
<httpTransport />
</binding>
</customBinding>
此自定义绑定包含两个元素:
标准 WCF 文本消息编码器被专门配置为使用 None 值,这使其能够处理未包装在 SOAP 信封中的 XML 消息有效负载。
使用 POX 消息通过 HTTP 进行通信的 WCF 客户端使用类似的绑定(如以下命令性代码所示)。
private static Binding CreatePoxBinding()
{
TextMessageEncodingBindingElement encoder =
new TextMessageEncodingBindingElement( MessageVersion.None, Encoding.UTF8 );
HttpTransportBindingElement transport = new HttpTransportBindingElement();
transport.ManualAddressing = true;
return new CustomBinding( new BindingElement[] { encoder, transport } );
}
由于 POX 客户端必须显式地指定其发送消息的 URI,因此通常必须通过设置HttpTransportBindingElement属性为ManualAddressing,以将true
配置为元素上的手动寻址模式。 这样就可以通过应用程序代码显式处理消息,并且每次应用程序向其他 HTTP URI 发送消息时,都不需要创建新的 ChannelFactory 消息。
由于 POX 消息不使用 SOAP 标头来传达重要的协议信息,因此 POX 客户端和服务通常必须处理用于发送或接收消息的基础 HTTP 请求的片段。 特定于 HTTP 的协议信息(如 HTTP 标头和状态代码)通过两个类显示在 WCF 编程模型中:
HttpRequestMessageProperty,其中包含有关 HTTP 请求的信息,例如 HTTP 方法和请求标头。
HttpResponseMessageProperty,其中包含有关 HTTP 响应的信息,例如 HTTP 状态代码和状态说明以及任何 HTTP 响应标头。
下面的代码示例演示如何创建 HTTP GET 请求消息,该消息已寻址到 http://localhost:8100/customers
。
Message request = Message.CreateMessage( MessageVersion.None, String.Empty );
request.Headers.To = "http://localhost:8100/customers";
HttpRequestMessageProperty property = new HttpRequestMessageProperty();
property.Method = "GET";
property.SuppressEntityBody = true;
request.Properties.Add( HttpRequestMessageProperty.Name, property );
首先,通过调用Message创建空请求CreateMessage(MessageVersion, String)。 该 None 参数用于指示不需要 SOAP 信封,并且参数 Empty 被传递作为动作。 然后,通过将 To 标头设置为所需的 URI 来发送请求消息。 接下来,创建一个 HttpRequestMessageProperty,将其设置为 HTTP 谓词 GET 方法,并将 Method 设置为 SuppressEntityBody,以指示在传出 HTTP 请求消息的正文中不应发送任何数据。 最后,请求属性将添加到 Properties 请求消息的集合中,以便它可以影响 HTTP 传输发送请求的方式。 然后,该消息已准备好通过相应的实例 IRequestChannel发送。
在服务上可以使用类似的技术从传入消息中提取 HttpRequestMessageProperty 并构造响应。