应用场景:工作需要追踪一个远程的wcf的服务是否正确,所以需要TcpTrace工具追踪远程服务是否抓取的数据是否正确。TcpTrace的原理很简单:
说的简单点TcpTrace就是一个监听/转发器(Listening/Forwarding)。当我们启动这个工具的时候,通过设置它监听的Port,和它将要转发的Host和Port(Destination Server& Destination Port),随后它就开始在本机的Listening Port开始监听,如果这时候一个针对该Listening Port 的Http Request,它就会把Request的内容取下来展现在我们的面前,随后将该Request转发到我们预先设定的Host和Port。
网上的例子都是在本地调用,所以先给出远程调用服务的注意事项。
1:是远程调用有权限的问题。所以需要在服务器的config文件中设置权限为None。
格式如下
<bindings>
<wsHttpBinding>
<binding name="NewBinding0">
<security mode="None" />
</binding>
</wsHttpBinding>
</bindings>
如果自己权限写的wcf的服务建议大家安一下方式写config.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="NewBinding0">
<security mode="None" />
</binding>
</wsHttpBinding>
</bindings>
<services>
<service behaviorConfiguration="MyServiceTypeBehaviors" name="Services.HelloService">
<endpoint binding="wsHttpBinding" bindingConfiguration="NewBinding0"
contract="Contracts.IHelloService" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8080/HelloService" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceTypeBehaviors" >
<!-- 将下列元素添加到服务行为配置中。 -->
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
关键点用红字标出.
2:在客户端同样要把binding.Security.Mode = SecurityMode.None;
3:增加一个远端调用ChannelFactory.
var factory = new ChannelFactory<IHelloService>(
binding, new EndpointAddress("http://192.168.1.57:8080/HelloService"));
4:增加发到TcpTrace的behavior。如下设置
//Add listening port only at client.
Uri tcpTraceUri = new Uri("http://localhost:8081/HelloService");
factory.Endpoint.Behaviors.Add(new ClientViaBehavior(tcpTraceUri));
var proxy = factory.CreateChannel();
var result = proxy.Greeting("WCF");
Console.WriteLine(result);
5:开启TcpTrace。
在监听端口写入自己定义的端口[8081],也就是在客户端配置的behavior里面uri里面的端口,目标服务器写入远端的ip。目标端口就是远程服务器服务的端口。
做完以上步骤就可以完成监听了。
下面的代码示例演示一个示例客户端配置文件。
<endpoint
address=http://localhost:8000/MyServer/
binding="wsHttpBinding"
bindingConfiguration="WSHttpBinding_IMyContract"
behaviorConfiguration="MyClient"
contract="IMyContract"
name="WSHttpBinding_IMyContract">
</endpoint>
<behaviors>
<endpointBehaviors>
<behavior name="MyClient">
<clientVia viaUri="http://localhost:8001/HelloService/>
</behavior>
</endpointBehaviors>
</behaviors>