对于希望对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
border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px;
分享到:
相关推荐
在这个“WCF我的WCF之旅示例代码”中,我们可以看到一系列逐步进阶的代码示例,这些示例有助于理解WCF的核心概念和技术。 首先,我们要了解WCF的基本组成部分: 1. **服务**:服务是WCF中的核心元素,它定义了对外...
**WCF之旅:一个简单的WCF程序** ...总结,WCF之旅是一个从零开始接触和学习WCF的好起点,通过实践一个简单的程序,你可以了解到服务的创建、配置、调用等基础操作,为后续深入学习WCF和其他相关技术打下坚实的基础。
我的WCF之旅- 创建一个简单的WCF程序 - Artech WCF入门之选绝佳的例子 代源源于:《WCF全面解析 上》 编程工具:VS2010 语言:C# blog 《IIS站点中部署 WCF项目》
在WCF4.0版本中,引入了路由服务(Routing Service),这是一个可自定义的服务,用于实现消息路由功能,允许你将客户端请求分发到多个不同的WCF服务,提供了一种灵活的服务发现和故障转移机制。本DEMO将展示如何使用...
**WCF之旅源代码——IIS寄宿与泛型序列化** Windows Communication Foundation(WCF)是微软.NET框架中用于构建分布式应用程序的服务模型。在这个源代码包中,我们聚焦于两个核心概念:IIS(Internet Information ...
通过这些代码,开发者可以了解并学习如何从零开始构建一个简单的WCF服务,并与之交互。 WCF的强大之处在于其灵活性和可扩展性。它允许自定义数据序列化器、认证机制、事务处理、错误处理等,满足不同场景的需求。...
我的WCF之旅后续篇,呀,要大于20字符啊,废话一下
通过“WCF分布式开发技术讲座”,你将有机会深入学习和实践这些知识,从而提升在分布式系统开发中的专业技能。提供的"ReadMe.txt"文件可能包含了课程大纲、讲师介绍和学习指导,而"WCF分布式开发技术讲座_1_从.NET到...
在WCF中,路由服务(WCF Routing Service)作为一个中间层,允许你集中管理和控制消息路由。路由服务通过定义自定义的路由规则,可以根据消息内容、消息头或其他条件来转发消息到合适的终点服务。这为分布式系统提供...
`WCF_自定义通道`展示了一个自定义通道的实现,这有助于理解WCF如何通过通道栈进行通信,并且提供了扩展WCF以适应不同网络环境的可能性。 6. **WCF双工通信**: 双工通信允许服务与客户端之间的双向交互,就像电话...
本课件包含课件,及对应源部分,为本人所做课件,可以对照文档一步步实现代码,本课件对WebService 进行了简单的介绍,WCF简单的应用 ,可以布置到各种寄宿平台上,
**消息队列(MSMQ)** 是微软提供的一种异步消息传递机制,它允许应用程序之间通过消息进行通信,即使发送方和接收方不在同一时间在线。MSMQ具有以下关键特性: 1. **可靠性**:MSMQ确保消息的可靠传输,即使发送方...
在《我的WCF之旅》中,我们可以期待深入学习WCF的基础概念以及如何通过实例来应用这些知识。WCF的核心概念包括服务、终结点、绑定和协定,这些是构建任何WCF服务的基础。 1. **服务**:在WCF中,服务是对外提供功能...
1. **服务**: WCF的核心单元,它定义了一组可调用的操作,可以通过网络进行访问。服务由服务契约定义,包含了服务的行为和接口。 2. **服务契约**: 描述服务提供的操作和消息交换模式。通常使用接口定义,并通过`...
在这个“WCF和TCP消息通信练习”中,我们将专注于使用WCF通过TCP进行通信。 **TCP(Transmission Control Protocol)**是一种面向连接的、可靠的传输层协议,它确保了数据在互联网上的可靠传输。TCP通过建立连接、...
标题中的“WCF部署问题1:HTTP错误404.17 - Not Found 请求的内容似乎是脚本,因而将无法由静态”是指在尝试部署Windows Communication Foundation...通过细致的排查和调整,通常可以找到并修复问题,成功部署WCF服务。
WCF路由,就是有个提供路由服务的服务器A,上面没有真正要运行的服务,而是提供了服务地址解析,另外有服务在服务器B、服务器C上,当需要调用WCF服务的时候,你不需要知道那个服务是有B还是C提供,只要访问A即可,A...
**WCF消息拦截示例代码**是针对Windows Communication Foundation(WCF)服务的一种技术实现,它允许我们在消息发送和接收时进行自定义处理。在WCF中,这种功能通常是通过实现`IDispatchMessageInspector`(服务端)...