您的位置:知识库 »

WCF专题系列(5):深入WCF寻址Part 5—逻辑地址和物理地址

作者: TerryLee  来源: 博客园  发布时间: 2008-11-07 14:07  阅读: 2294 次  推荐: 0   原文链接   [收藏]  

物理地址模式

了解了物理地址和逻辑地址之间的关系,我们再看一下在设置监听地址时的两种模式,通过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所示:

TerryLee_WCF_16

图3

这里tcpTrace监听的端口号就是我们在客户端配置的物理地址端口号,而分发地址才是服务的真正地址,最终可以看到截获的消息,如图4所示:

TerryLee_WCF_17

图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所示:

TerryLee_WCF_18

图5

可以看到,利用物理地址和逻辑地址的知识,可以轻松的实现路由,当然tcpTrace只是路由中非常简单的一种使用,后面我们还会讲到更加复杂的应用。

结束语

本文详细介绍了WCF中的物理地址和逻辑地址,它的相关原理以及如何使用tcpTrace来实现SOAP消息的跟踪。关于WCF寻址相关文章:

WCF专题系列(4):深入WCF寻址Part 4—自定义消息筛选器

WCF专题系列(3):深入WCF寻址Part 3—消息过滤引擎

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

WCF专题系列(1):深入WCF寻址Part 1—Web服务寻址规范

0
0

热门文章

    最新文章

      最新新闻

        热门新闻