对于希望对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,模拟服务的调用者
服务契约: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
本文介绍了一种利用tcpTracer工具在WCF中实现消息路由的方法。通过创建一个简单的WCF服务应用程序,演示了如何设置tcpTracer进行消息拦截、显示和转发。此工具能够帮助开发者深入理解WCF消息交换过程。

652

被折叠的 条评论
为什么被折叠?



