天天看点

WCF后传系列(2):深入WCF寻址Part 2—自定义寻址报头

了解了Web服务寻址规范,再回到WCF,在WCF中,终结点地址是由EndpointAddress类来表示的,它其中很重要的几个部分是:一个表示服务地址的统一资源定位符 (URI),一个表示服务的安全标识的 Identity 和一个可选的 Headers 集合,其中Headers用于标识终结点或与终结点交互的更多详细寻址信息。如图1所示:

图1

<a href="http://11011.net/software/vspaste"></a>

在WCF中提供了基址技术,这使的我们在指定终结点地址时可以酌情选用相对地址或者绝对地址,指定绝对地址的方法是在终结点定义中提供完全限定的地址,如下代码所示:

使用绝对地址固然简单,但是如果我们的服务需要公开多个终结点,而这些终结点地址又具有相同的基地址时,也许相对地址是更好的选择。在创建服务宿主对象时,提供一个基地址,如下代码所示:

又或者同时在配置文件中指定基地址,这样就无须在每个终结点中指定绝对地址了,如下代码所示:

但请注意,基址技术是为我们在配置终结点时提供了方便,客户端对它是毫无所知的,客户端看到的仍然是绝对地址,在打开服务宿主时,它会匹配所有的相对地址,从而为每个终结点提供相应的绝对地址,如上面的示例,可以在WSDL中看到:

如果在指定了基地址的情况下,有以下几种情况:指定相对地址为空,终结点地址与基地址相同;指定相对地址不为空,追加相对地址到基地址上;指定一个绝对地址,基地址不起作用,终结点地址仍然为指定的绝对地址;指定一个绝对地址和一个与基地址不同的绑定,基地址不起作用。现在有这样一段配置信息:

可以在ServiceHost启动后,输出所有的终结点地址和绑定信息,如下代码:

输出结果如图2所示:

图2

终结点地址在WSDL中表示为对应终结点的 wsdl:port元素内的终结点引用(EndpointReference)元素。终结点引用包含终结点的地址以及所有的地址属性,如下示例代码所示:

在本文的终结点定义一节,我们提到了寻址报头,在某些情况下,我们可能希望通过自定义寻址报头来解决一些复杂的问题,如根据根据传入的寻址报头中是否包含某些信息,将其转发到不同的终结点,通过自定义寻址报头,可以实现SOAP消息的无限扩展,放置任何希望的控制信息到SOAP消息。如下面的代码:

我们在WSDL中可以看到该自定义的报头,它作为终结点引用的引用参数:

截获到SOAP消息可以看到,在消息报头中添加了basic这样的信息,如下代码所示:

当然我们也可以通过配置的方式来自定义寻址报头,如下代码所示:

<a href="http://www.cnblogs.com/Terrylee/archive/2008/10/31/WCF-Addressing-ListenUri-and-EndpointAddress.html">WCF专题系列(5):深入WCF寻址Part 5—逻辑地址和物理地址</a>

<a href="http://www.cnblogs.com/Terrylee/archive/2008/10/30/WCF-Addressing-Part3-Customize-Message-Filter.html">WCF专题系列(4):深入WCF寻址Part 4—自定义消息筛选器</a>

<a href="http://www.cnblogs.com/Terrylee/archive/2008/10/27/WCF-Addressing-Part3-Message-Filter.html">WCF专题系列(3):深入WCF寻址Part 3—消息过滤引擎</a>

<a href="http://www.cnblogs.com/Terrylee/archive/2008/10/25/WCF-addressing-part1.html">WCF专题系列(1):深入WCF寻址Part 1—Web服务寻址规范</a>

本文转自lihuijun51CTO博客,原文链接:http://blog.51cto.com/terrylee/151929 ,如需转载请自行联系原作者

继续阅读