`
varsoft
  • 浏览: 2508667 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

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

阅读更多

对于希望对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

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之旅示例代码”中,我们可以看到一系列逐步进阶的代码示例,这些示例有助于理解WCF的核心概念和技术。 首先,我们要了解WCF的基本组成部分: 1. **服务**:服务是WCF中的核心元素,它定义了对外...

    WCF之旅:一个简单的WCF程序(vs2010源码)

    **WCF之旅:一个简单的WCF程序** ...总结,WCF之旅是一个从零开始接触和学习WCF的好起点,通过实践一个简单的程序,你可以了解到服务的创建、配置、调用等基础操作,为后续深入学习WCF和其他相关技术打下坚实的基础。

    我的WCF之旅:计算器 WCF样例源代码

    我的WCF之旅- 创建一个简单的WCF程序 - Artech WCF入门之选绝佳的例子 代源源于:《WCF全面解析 上》 编程工具:VS2010 语言:C# blog 《IIS站点中部署 WCF项目》

    WCF路由分发DEMO

    在WCF4.0版本中,引入了路由服务(Routing Service),这是一个可自定义的服务,用于实现消息路由功能,允许你将客户端请求分发到多个不同的WCF服务,提供了一种灵活的服务发现和故障转移机制。本DEMO将展示如何使用...

    我的WCF之旅源代码 IIS寄宿

    **WCF之旅源代码——IIS寄宿与泛型序列化** Windows Communication Foundation(WCF)是微软.NET框架中用于构建分布式应用程序的服务模型。在这个源代码包中,我们聚焦于两个核心概念:IIS(Internet Information ...

    我的WCF之旅源代码_创建一个简单的WCF程序

    通过这些代码,开发者可以了解并学习如何从零开始构建一个简单的WCF服务,并与之交互。 WCF的强大之处在于其灵活性和可扩展性。它允许自定义数据序列化器、认证机制、事务处理、错误处理等,满足不同场景的需求。...

    我的WCF之旅后续篇

    我的WCF之旅后续篇,呀,要大于20字符啊,废话一下

    WCF分布式开发技术讲座

    通过“WCF分布式开发技术讲座”,你将有机会深入学习和实践这些知识,从而提升在分布式系统开发中的专业技能。提供的"ReadMe.txt"文件可能包含了课程大纲、讲师介绍和学习指导,而"WCF分布式开发技术讲座_1_从.NET到...

    WCF路由、免代理、实现AOP拦截源码附数据库

    在WCF中,路由服务(WCF Routing Service)作为一个中间层,允许你集中管理和控制消息路由。路由服务通过定义自定义的路由规则,可以根据消息内容、消息头或其他条件来转发消息到合适的终点服务。这为分布式系统提供...

    WCF系列学习源码

    `WCF_自定义通道`展示了一个自定义通道的实现,这有助于理解WCF如何通过通道栈进行通信,并且提供了扩展WCF以适应不同网络环境的可能性。 6. **WCF双工通信**: 双工通信允许服务与客户端之间的双向交互,就像电话...

    WCF 学习之旅

    本课件包含课件,及对应源部分,为本人所做课件,可以对照文档一步步实现代码,本课件对WebService 进行了简单的介绍,WCF简单的应用 ,可以布置到各种寄宿平台上,

    消息队列+WCF项目实现完整版

    **消息队列(MSMQ)** 是微软提供的一种异步消息传递机制,它允许应用程序之间通过消息进行通信,即使发送方和接收方不在同一时间在线。MSMQ具有以下关键特性: 1. **可靠性**:MSMQ确保消息的可靠传输,即使发送方...

    我的WCF之旅

    在《我的WCF之旅》中,我们可以期待深入学习WCF的基础概念以及如何通过实例来应用这些知识。WCF的核心概念包括服务、终结点、绑定和协定,这些是构建任何WCF服务的基础。 1. **服务**:在WCF中,服务是对外提供功能...

    WCF技术专题:WCF入门与进阶

    1. **服务**: WCF的核心单元,它定义了一组可调用的操作,可以通过网络进行访问。服务由服务契约定义,包含了服务的行为和接口。 2. **服务契约**: 描述服务提供的操作和消息交换模式。通常使用接口定义,并通过`...

    WCF和TCP消息通信练习

    在这个“WCF和TCP消息通信练习”中,我们将专注于使用WCF通过TCP进行通信。 **TCP(Transmission Control Protocol)**是一种面向连接的、可靠的传输层协议,它确保了数据在互联网上的可靠传输。TCP通过建立连接、...

    WCF布署问题1 :HTTP 错误 404.17 - Not Found 请求的内容似乎是脚本,因而将无法由静态

    标题中的“WCF部署问题1:HTTP错误404.17 - Not Found 请求的内容似乎是脚本,因而将无法由静态”是指在尝试部署Windows Communication Foundation...通过细致的排查和调整,通常可以找到并修复问题,成功部署WCF服务。

    WCF 路由服务 for apx

    WCF路由,就是有个提供路由服务的服务器A,上面没有真正要运行的服务,而是提供了服务地址解析,另外有服务在服务器B、服务器C上,当需要调用WCF服务的时候,你不需要知道那个服务是有B还是C提供,只要访问A即可,A...

    WCF消息拦截示例代码

    **WCF消息拦截示例代码**是针对Windows Communication Foundation(WCF)服务的一种技术实现,它允许我们在消息发送和接收时进行自定义处理。在WCF中,这种功能通常是通过实现`IDispatchMessageInspector`(服务端)...

Global site tag (gtag.js) - Google Analytics