[原创]WCF后续之旅(17):通过tcpTracer进行消息的路由

本文介绍了一种利用tcpTracer工具在WCF中实现消息路由的方法。通过创建一个简单的WCF服务应用程序,演示了如何设置tcpTracer进行消息拦截、显示和转发。此工具能够帮助开发者深入理解WCF消息交换过程。

对于希望对WCF的消息交换有一个深层次了解的读者来说,tcpTracer绝对是一个不可多得好工具。我们将tcpTracer置于服务和服务代理之间,tcpTracer会帮助我们接获、显示和转发流经他的消息。

从本质上讲,tcpTracer是一个路由器。当启动的时候,我们需要设置两个端口:原端口(source port)和目的端口(destination port),然后tcpTracer就会在原端口进行网络监听。一旦请求抵达,他会截获整个请求的消息,并将整个消息显示到消息面板上。随后,tcpTracer会将该消息原封不动地转发给目的端口。在另一方面,从目的端口发送给原端口的消息,也同样被tcpTracer截获、显示和转发。

接下来我们我们通过下面的步骤演示如何通过tcpTracer在WCF中进行消息的路由。

步骤一、创建一个简单的WCF应用

为了演示tcpTracer在WCF中的应用,我们需要先创建一个简单的WCF服务的应用,为此我们创建一个简单计算服务的例子。

整个应用采用如下图所示的四层结构:Contracts、Services、Hosting和Clients。

  • Contracts:class library项目,定义所有的契约,包括服务契约、数据契约、消息契约以及错误契约,刚项目同时被其他三个项目引用
  • Services:class library项目,实现了在Contracts中定义的服务契约
  • Hosting:控制台项目,同时引用Contracts和Services,实现对定义在Services项目的服务的寄宿
  • Clients:控制台项目,引用Contracts,模拟服务的调用者

image

服务契约:Artech.TcpTraceDemo.Contracts.ICalculate

   1: //---------------------------------------------------------------
<!--CRLF-->
   2: // EndpointAddress & WCF Addressing (c) by 2008 Jiang Jin Nan
<!--CRLF-->
   3: //---------------------------------------------------------------
<!--CRLF-->
   4: using System.ServiceModel;
<!--CRLF-->
   5: namespace Artech.TcpTraceDemo.Contracts
<!--CRLF-->
   6: {
<!--CRLF-->
   7:     [ServiceContract]
<!--CRLF-->
   8:     public interface ICalculate
<!--CRLF-->
   9:     {
<!--CRLF-->
  10:         [OperationContract]
<!--CRLF-->
  11:         double Add(double x, double y);
<!--CRLF-->
  12:     }
<!--CRLF-->
  13: } 
<!--CRLF-->

服务实现:Artech.TcpTraceDemo. Services. CalculateService

   1: //---------------------------------------------------------------
<!--CRLF-->
   2: // EndpointAddress & WCF Addressing (c) by 2008 Jiang Jin Nan
<!--CRLF-->
   3: //---------------------------------------------------------------
<!--CRLF-->
   4: using Artech.TcpTraceDemo.Contracts; 
<!--CRLF-->
   5: 
<!--CRLF-->
   6: namespace Artech.TcpTraceDemo.Services
<!--CRLF-->
   7: {
<!--CRLF-->
   8:     public class CalculateService:ICalculate
<!--CRLF-->
   9:     {
<!--CRLF-->
  10:         #region ICalculate Members 
<!--CRLF-->
  11: 
<!--CRLF-->
  12:         public double Add(double x, double y)
<!--CRLF-->
  13:         {
<!--CRLF-->
  14:             return x + y;
<!--CRLF-->
  15:         } 
<!--CRLF-->
  16: 
<!--CRLF-->
  17:         #endregion
<!--CRLF-->
  18:     }
<!--CRLF-->
  19: } 
<!--CRLF-->

服务寄宿(代码):Artech.TcpTraceDemo.Hosting. Program

   1: //---------------------------------------------------------------
<!--CRLF-->
   2: // EndpointAddress & WCF Addressing (c) by 2008 Jiang Jin Nan
<!--CRLF-->
   3: //---------------------------------------------------------------
<!--CRLF-->
   4: using System;
<!--CRLF-->
   5: using System.ServiceModel;
<!--CRLF-->
   6: using Artech.TcpTraceDemo.Services; 
<!--CRLF-->
   7: 
<!--CRLF-->
   8: namespace Artech.TcpTraceDemo.Hosting
<!--CRLF-->
   9: {
<!--CRLF-->
  10:     class Program
<!--CRLF-->
  11:     {
<!--CRLF-->
  12:         static void Main(string[] args)
<!--CRLF-->
  13:         {
<!--CRLF-->
  14:             using (ServiceHost serviceHost = new ServiceHost(typeof(CalculateService)))
<!--CRLF-->
  15:             {
<!--CRLF-->
  16:                 serviceHost.Opened += delegate
<!--CRLF-->
  17:                 {
<!--CRLF-->
  18:                     Console.WriteLine("The Calculate Service has been started up!");
<!--CRLF-->
  19:                 };
<!--CRLF-->
  20:                 serviceHost.Open(); 
<!--CRLF-->
  21: 
<!--CRLF-->
  22:                 Console.Read();
<!--CRLF-->
  23:             }
<!--CRLF-->
  24:         }
<!--CRLF-->
  25:     }
<!--CRLF-->
  26: } 
<!--CRLF-->
  27: 
<!--CRLF-->

服务寄宿(配置):App.config

   1: <?xml version="1.0" encoding="utf-8" ?>
<!--CRLF-->
   2: <configuration>
<!--CRLF-->
   3:     <system.serviceModel>
<!--CRLF-->
   4:         <bindings>
<!--CRLF-->
   5:             <customBinding>
<!--CRLF-->
   6:                 <binding name="SimpleBinding">
<!--CRLF-->
   7:                     <textMessageEncoding />
<!--CRLF-->
   8:                     <httpTransport />
<!--CRLF-->
   9:                 </binding>
<!--CRLF-->
  10:             </customBinding>
<!--CRLF-->
  11:         </bindings>
<!--CRLF-->
  12:         <services>
<!--CRLF-->
  13:             <service name="Artech.TcpTraceDemo.Services.CalculateService">
<!--CRLF-->
  14:                 <endpoint address="http://127.0.0.1:9999/calculateservice" binding="customBinding"                    bindingConfiguration="SimpleBinding" contract="Artech.TcpTraceDemo.Contracts.ICalculate"/>
<!--CRLF-->
  15:             </service>
<!--CRLF-->
  16:         </services>
<!--CRLF-->
  17:     </system.serviceModel>
<!--CRLF-->
  18: </configuration> 
<!--CRLF-->
  19: 
<!--CRLF-->

注:由于本例仅仅用于模拟消息的路由,所以我们仅仅需要绑定提供的传输和编码功能,所以在这里我使用了自定义绑定,并且添加两个BindElement:HttpTransport和TextMessageEncoding。

服务访问(代码):Artech.TcpTraceDemo.Clients.Program

   1: //---------------------------------------------------------------
<!--CRLF-->
   2: // EndpointAddress & WCF Addressing (c) by 2008 Jiang Jin Nan
<!--CRLF-->
   3: //---------------------------------------------------------------
<!--CRLF-->
   4: using System.ServiceModel;
<!--CRLF-->
   5: using Artech.TcpTraceDemo.Contracts;
<!--CRLF-->
   6: using System;
<!--CRLF-->
   7: namespace Artech.TcpTraceDemo.Clients
<!--CRLF-->
   8: {
<!--CRLF-->
   9:     class Program
<!--CRLF-->
  10:     {
<!--CRLF-->
  11:         static void Main(string[] args)
<!--CRLF-->
  12:         {
<!--CRLF-->
  13:             using (ChannelFactory<ICalculate> channelFactory = new ChannelFactory<ICalculate>("calculateService"))
<!--CRLF-->
  14:             {
<!--CRLF-->
  15:                 ICalculate calculator = channelFactory.CreateChannel();
<!--CRLF-->
  16:                 using (calculator as IDisposable)
<!--CRLF-->
  17:                 { 
<!--CRLF-->
  18:                     Console.WriteLine("x + y = {2} where x = {0} and y = {1}",1,2,calculator.Add(1,2));
<!--CRLF-->
  19:                 }
<!--CRLF-->
  20:             } 
<!--CRLF-->
  21: 
<!--CRLF-->
  22:             Console.Read();
<!--CRLF-->
  23:         }
<!--CRLF-->
  24:     }
<!--CRLF-->
  25: } 
<!--CRLF-->
  26: 
<!--CRLF-->

服务访问(配置):App.config

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值