WCF专题系列(5):深入WCF寻址Part 5—逻辑地址和物理地址
[2] WCF专题系列(5):深入WCF寻址Part 5—逻辑地址和物理地址
[3] WCF专题系列(5):深入WCF寻址Part 5—逻辑地址和物理地址
物理地址模式
了解了物理地址和逻辑地址之间的关系,我们再看一下在设置监听地址时的两种模式,通过ListenUriMode枚举来指定,它定义了两个枚举值:
Explicit:完全原样使用 ListenUri,默认值。
Unique:指定传输是否应使用特定传输机制,以确保 ListenUri 是唯一的
根据传输所采用的协议不同,WCF会采用不同的策略来保证ListenUri唯一,具体的策略如下所示:
1.非TCP传输,在ListenUri的末尾附加一个GUID。
2.对于独占模式下的 TCP(PortSharingEnabled 为 false),绑定到一个唯一可用端口号。
3.对于端口共享模式下的 TCP(PortSharingEnabled 为 true),在ListenUri的末尾附加一个GUID。
TcpTrace消息截获
前面讲了这么多物理地址和逻辑地址,它们最重要的使用地方就是做路由。我们常用tcpTrace来做SOAP消息跟踪,它正是利用这一点技术,在客户端配置ClientViaBehavior,指向tcpTrace的侦听地址,然后tcpTrace在对消息做记录后再转发到服务端,如在服务端的配置如下,它的物理地址和逻辑是相同的:
<service name="TerryLee.WCFAddressing.Service.CalculatorService" behaviorConfiguration="calculatorBehavior"> <host> <baseAddresses> <add baseAddress="http://localhost:8887/Calculator"/> baseAddresses> host> <endpoint address="http://localhost:8887/CalculatorService" binding ="wsHttpBinding" contract="TerryLee.WCFAddressing.Contract.ICalculator"> endpoint> service>
客户端的配置,这里“http://localhost:8887/CalculatorService”是真正的服务地址(逻辑地址),我们通过ClientViaBehavior告诉客户端物理地址是“http://localhost:8080/CalculatorService”,事实上处于该物理地址的服务并不存在,该地址是tcpTrace的监听地址:
xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<client>
<endpoint address="http://localhost:8887/CalculatorService"
binding="wsHttpBinding"
contract="TerryLee.WCFAddressing.Contract.ICalculator"
behaviorConfiguration="calculatorEndpointBehavior">
endpoint>
client>
<behaviors>
<endpointBehaviors>
<behavior name="calculatorEndpointBehavior">
<clientVia viaUri="http://localhost:8080/CalculatorService" />
behavior>
endpointBehaviors>
behaviors>
system.serviceModel>
configuration>
tcpTrace的配置如图3所示:
图3
这里tcpTrace监听的端口号就是我们在客户端配置的物理地址端口号,而分发地址才是服务的真正地址,最终可以看到截获的消息,如图4所示:
图4
如果不在客户端配置ClientViaBehavior,利用物理地址和逻辑地址的知识,我们还可以有另外一种方式使用tcpTrace。前面我说过,逻辑地址是包含在WSDL中,所以对于客户端来说知道的是逻辑地址,它会向该地址发送消息,这样我们可以配置终结点的逻辑地址为tcpTrace侦听的地址,而为服务端指定另外一个物理地址,并配置tcpTrace向该物理地址转发消息,如服务端的配置如下:
<service name="TerryLee.WCFAddressing.Service.CalculatorService" behaviorConfiguration="calculatorBehavior"> <host> <baseAddresses> <add baseAddress="http://localhost:8080/Calculator"/> baseAddresses> host> <endpoint address="http://localhost:8887/CalculatorService" binding ="wsHttpBinding" contract="TerryLee.WCFAddressing.Contract.ICalculator" listenUri="http://localhost:8080/CalculatorService"> endpoint> service>
而客户端则不用再配置ClientViaBehavior,如下代码所示:
xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<client>
<endpoint address="http://localhost:8887/CalculatorService"
binding="wsHttpBinding"
contract="TerryLee.WCFAddressing.Contract.ICalculator">
endpoint>
client>
system.serviceModel>
configuration>
现在“http://localhost:8887/CalculatorService”是逻辑地址,配置tcpTrace监听该地址,并向服务的物理地址“http://localhost:8080/CalculatorService”转发消息,如图5所示:
图5
可以看到,利用物理地址和逻辑地址的知识,可以轻松的实现路由,当然tcpTrace只是路由中非常简单的一种使用,后面我们还会讲到更加复杂的应用。
结束语
本文详细介绍了WCF中的物理地址和逻辑地址,它的相关原理以及如何使用tcpTrace来实现SOAP消息的跟踪。关于WCF寻址相关文章:
WCF专题系列(4):深入WCF寻址Part 4—自定义消息筛选器
WCF专题系列(3):深入WCF寻址Part 3—消息过滤引擎