前面的几篇文章,我们学习了怎么开发WCF应用程序与服务,也学习了如何进行WCF的配置。对于Web Service与WCF服务应用,服务端与客户端的通信是通过收发SOAP Message进行,我们如何有效而快速的获取通信信息呢?这就是本文要介绍的一个工具。

一、TcpTrace实现的基本原理

在对Web Service和WCF进行调试时,可以使用Soap Trace 工具对Soap Message进行深入捕获并进行分析。经常使用的工具有TcpTrace与Microsoft Soap Toolkit中的Soap Trace Utility。

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

首先来讲讲TcpTrace实现的基本原理。说简单点,TcpTracer就是一个监听/转发器(Listening/Forwarding),就是一个路由器。当启动的时候,我们需要设置两个端口:监听端口(Listening Port)和目的主机(Destination Server)与目的端口(Destination Port),然后TcpTracer就会在本机的监听端口进行网络监听。一旦有针对该监听端口的请求抵达,他会截获整个请求的消息,并将整个消息显示到消息面板上。随后,TcpTracer会将该消息原封不动地转发给目的主机与目的端口。在另一方面,从目的主机与目的端口发送给原端口的消息,也同样被TcpTracer截获、显示和转发。 说白了就是把要发的消息先给我们查看和备份,再转发出去。

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

1) 为了演示TcpTracer在WCF中的应用,还是用我们前面做的书籍查询示例的WCF服务应用(BookService),具体参见WCF学习之旅——第一个WCF示例(一)与WCF学习之旅—WCF第二个示例(五)。

2) 示例中的终结点的地址为:http://127.0.0.1:8888/BookService(Port为8888)。

3) 同时这个服务端的配置文件信息如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration><configSections><!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --><section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </configSections><entityFramework><defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /><providers><provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /></providers></entityFramework> <system.serviceModel>   <diagnostics><messageLogging logEntireMessage="true" logKnownPii="false" logMalformedMessages="true"logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" /><endToEndTracing propagateActivity="true" activityTracing="true"messageFlowTracing="true" /></diagnostics><behaviors><serviceBehaviors><behavior name="metadataBehavior"><serviceMetadata httpGetEnabled="true" httpGetUrl="http://127.0.0.1:8888/BookService/metadata" /><serviceDebug includeExceptionDetailInFaults="True" /></behavior></serviceBehaviors>     </behaviors><services><service behaviorConfiguration="metadataBehavior" name="SCF.WcfService.BookService"><endpoint address="http://127.0.0.1:8888/BookService" binding="wsHttpBinding"contract="SCF.Contracts.IBookService" /></service></services></system.serviceModel> <startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /></startup>
<system.diagnostics><sources><source name="System.ServiceModel" switchValue="Warning" propagateActivity="true"><listeners><add name="xml" /></listeners></source></sources><sharedListeners><add name="xml" type="System.Diagnostics.XmlWriterTraceListener" initializeData="D:\wcf.svclog" /></sharedListeners>
</system.diagnostics>
</configuration>

4) 客户端的配置信息如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration><startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /></startup><system.serviceModel><bindings><wsHttpBinding><binding name="WSHttpBinding_IBookService" /><binding name="WSHttpBinding_IBookService1" /></wsHttpBinding></bindings><client><endpoint address="http://127.0.0.1:8888/BookService" binding="wsHttpBinding"bindingConfiguration="WSHttpBinding_IBookService" contract="SCF.Contracts.IBookService"name="WSHttpBinding_IBookService"><identity><userPrincipalName value="DEVELOPER\Administrator" /></identity></endpoint><endpoint address="http://127.0.0.1:8888/BookService" binding="wsHttpBinding"bindingConfiguration="WSHttpBinding_IBookService1" contract="BookServiceRef.IBookService"name="WSHttpBinding_IBookService1"><identity><userPrincipalName value="DEVELOPER\Administrator" /></identity></endpoint></client></system.serviceModel>
</configuration>

5)  但是通过上面的设置之后,实际上还是不能够进行数据的捕捉,如下图,无论如何在客户端调用WCF应用,TcpTrace是无法捕捉到任何数据的。

这是为什么呢?请往下看。

二、通过ClientViaBehavior实现基于TcpTracer的消息路由

在我们创建的WCF服务来说,整个服务访问只涉及到两方:服务(BookService)和服务的调用者(客户端)。从消息交换的角度来看,服务的调用者调用者将请求消息直接发送到服务端,计算结果也以回复消息的形式直接返回到服务的调用者。

现在我们需要将TcpTracer作为一个路由器引入到服务(BookService)和服务的调用者 (客户端)之间,那么我们需要解决的是:服务调用者发送的消息不能直接发送到服务端,而应该先发送给TcpTracer,再由TcpTracer转发给服务。我们可以通过ClientViaBehavior实现逻辑地址和物理地址的分离——逻辑地址指向最终的服务,而物理地址则指向 TcpTracer。

具体的原理如下图所示:我们将TcpTracer的监听端口(Listening Port)和目的端口(Destination port)设置成8080和8888(BookService地址所在的端口)。通过ClientViaBehavior将物理地址的端口设成 8080(TcpTracer监听端口)。

注:对于消息发送方来说,SOAP消息的To报头对应的地址由发送端的终结点地址(逻辑地址)决定。

基于上面的实现原理,我们需要修改客户端的配置, 在<system.serviceModel>/<behaviors>/<endpointBehaviors> 添加ClientViaBehavior,将viaUri的端口指定为8080:http://127.0.0.1:8080/BookService。并将该EndpointBehavior应用到终结点中。

1)  配置文件信息修改一下,如下面。请仔细比较一下面的客户端配置文件与上篇文章最后的客户端配置文件的区别:

<?xml version="1.0" encoding="utf-8" ?>
<configuration><startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /></startup><system.serviceModel><bindings><wsHttpBinding><binding name="WSHttpBinding_IBookService" /><binding name="WSHttpBinding_IBookService1" /></wsHttpBinding></bindings><behaviors><endpointBehaviors><behavior name="bookServiceEndpointBehavior"><clientVia viaUri="http://localhost:8080/BookService" /></behavior></endpointBehaviors></behaviors><client><endpoint address="http://127.0.0.1:8888/BookService" binding="wsHttpBinding" behaviorConfiguration="bookServiceEndpointBehavior"bindingConfiguration="WSHttpBinding_IBookService" contract="SCF.Contracts.IBookService"name="WSHttpBinding_IBookService"><identity><userPrincipalName value="DEVELOPER\Administrator" /></identity></endpoint><endpoint address="http://127.0.0.1:8888/BookService" binding="wsHttpBinding" behaviorConfiguration="bookServiceEndpointBehavior"bindingConfiguration="WSHttpBinding_IBookService1" contract="BookServiceRef.IBookService"name="WSHttpBinding_IBookService1"><identity><userPrincipalName value="DEVELOPER\Administrator" /></identity></endpoint></client></system.serviceModel>
</configuration>

2) 经过修改保存之后,现在可以进行Soap Trace了,现在我们再次启动TcpTrace。进行如下的设置,如下图。

监听端口(Listen On Port#):可以自由设置,但是不能够与服务的端口重合,并且该端口还需要在客户端注册。在这里设置成8080

目标端口(Destination Port #):服务端口。在这里设置成8888。

3) 先运行Hosting程序,然后运行WinClient,在WinClient中发起请求,这时请求消息和回复消息将会显示到TcpTracer的消息显示面板中,如下图所示:

4)  我们还可以通过日志,把信息记录下来,记录日志的配置如下图。

5)  当关闭tcpTrace时相应的内容被记录到我们指定的Log文件中:

转载于:https://www.cnblogs.com/0lxp/p/9949564.html

TcpTrace实现的基本原理相关推荐

  1. Computer OS系统基本原理

    Computer OS系统基本原理 第一章 绪论(考概念) 什么是OS? o 操作系统是一组控制和管理计算机软硬件资源.合理地对各类作业进行调度以及方便用户使用的程序集合. o 操作系统是位于硬件层( ...

  2. XGBoost4J-Spark基本原理

    XGBoost4J-Spark基本原理 XGBoost4J-Spark是一个项目,旨在通过使XGBoost适应Apache Spark的MLLIB框架,无缝集成XGBoost和Apache Spark ...

  3. Docker基本原理概述

    Docker基本原理概述 Docker是一个用于开发,交付和运行应用程序的开放平台.Docker能够将应用程序与基础架构分开,从而可以快速交付软件.借助Docker,可以以与管理应用程序相同的方式来管 ...

  4. 多机多卡训练基本原理

    多机多卡训练基本原理 在工业实践中,许多较复杂的任务需要使用更强大的模型.强大模型加上海量的训练数据,经常导致模型训练耗时严重.比如在计算机视觉分类任务中,训练一个在ImageNet数据集上精度表现良 ...

  5. MindSpore基本原理

    MindSpore基本原理 • MindSpore介绍 o 自动微分 o 自动并行 • 安装 o pip方式安装 o 源码编译方式安装 o Docker镜像 • 快速入门 • 文档 MindSpore ...

  6. Docker Context基本原理

    Docker Context基本原理 介绍 本指南介绍了上下文如何使单个Docker CLI轻松管理多个Swarm集群.多个Kubernetes集群和多个单独的Docker节点. 单个Docker C ...

  7. 垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?...

    一.垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?   1.对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址.大小以及使用情况. 通常, ...

  8. g-git 相关命令 及其 基本原理探索(二):git 在工作中的常用命令操作 ,超级实用!!!

    上一篇git 基本原理对git的使用以及文件分布已经有了一个整体的了解. 本篇将对工作中常用的一些git 操作命令的操作进行总结归纳,方便今后查阅. 文章目录 1. 分离头指针 2. 通过HEAD 来 ...

  9. JVM学习--(一)基本原理

    前言 JVM一直是java知识里面进阶阶段的重要部分,如果希望在java领域研究的更深入,则JVM则是如论如何也避开不了的话题,本系列试图通过简洁易读的方式,讲解JVM必要的知识点. 运行流程 我们都 ...

  10. Flink 基本原理与生产实践分享【入门必读,概念清晰】

    Flink 基本原理与生产实践分享[入门必读,概念清晰] https://zh.wikipedia.org/zh-hans/Apache_Flink Apache Flink是由Apache软件基金会 ...

最新文章

  1. 关于软件开发你真正需要知道的几个事情
  2. matlab axes标题,Matlab 坐标轴(axes),数据提示(data cursor),标题(title)等的默认字体问题...
  3. redmine备份_Redmine 数据迁移记录
  4. SpringBoot环境下QueryDSL-JPA的使用
  5. 案例研究:设计与方法_如何进行1小时的重新设计(案例研究)
  6. 对口计算机专业分数线,湖南省2021年普通高校招生本科批(职高对口类)平行一志愿投档分数线公布...
  7. docker 远程访问_Docker 与其守护进程
  8. [转载] python学习笔记numpy(一)np.zero
  9. asp.net页面加载时间计算
  10. Symbian 项目
  11. python做有道翻译接口的时候报UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid sta
  12. 汽车距离报警系统c语言编程,基于单片机的汽车防盗报警系统的设计本科生毕业论文.doc...
  13. angular的 #
  14. 1165.穹妹的求助
  15. 26个数据分析案例——第二站:基于Hive的民航客户价值分析
  16. Java中线程是如何实现的
  17. 计算机外文参考文献2018,2018年英文参考文献格式-推荐word版 (5页)
  18. 2017年全球最有影响力的50家机器人公司排行榜
  19. RGB、YUV420p、YUV420sp之间的互相转换(C++)
  20. codegear的希望

热门文章

  1. 《Effective Java 3rd》读书笔记——类和接口
  2. 分布式系统中协调和复制技术的原理
  3. 经验之谈:程序员应该如何学好大数据技术
  4. 数据分析 | 将业务问题转换为统计问题后,我看到了数字的真相
  5. OpenSolaris系统管理
  6. 读这样的文章才能清楚什么是RIA
  7. 成功演示六要素之四五——可信与情感
  8. python3爬虫 - 利用浏览器cookie登录
  9. leetcode Best Time to Buy and Sell Stock专题
  10. CLion设置背景图片(Pycharm等)