【.net 深呼吸】记录WCF的通信消息

前面老周给大伙伴们介绍了把跟踪信息写入日志文件的方法,今天咱们换个类似的话题来扯一下,对了,咱们就说说怎么把WCF的往来消息log下来吧。

尽管在现实生活中,我们不主张偷窥他人信息,不过,偷窥程序信息是一件很快乐的事。

在很多情况下,WCF是用SOAP来完成数据交换的,SOAP是啥,网上搜一搜叫知道了,不要太在意概念,不懂的概念就网上搜,搜到后大致看一下即可。

要是能把WCF服务的每轮通信的SOAP消息记录下来,除了有助于管理服务外,其实还可以帮助我们了解WCF的调用过程(可以看到它与客户端的往来信息)。

好,F话不多说,理论知识老周也不想讲太多,因为这方面是资料可查的。直接上方法吧。

先看服务器的实现。

    [ServiceContract(Namespace = "http://cat.org",Name = "_cat")]
    interface ITest
    {
        [OperationContract(Name = "say_to_cat")]
        string SayHelloToCat([MessageParameter(Name = "pcat")]string catName);
    }

    public class MyService : ITest
    {
        public string SayHelloToCat(string catName)
        {
            return $"{catName} 是一只X猫,从来没抓过老鼠。";
        }
    }

先定义服务协定,然后实现服务类,这个相信大家都会,很Easy,哦,对了,啥是服务协定呢,就是服务器和客户端们签订了一份劳动合同,服务器定义好协定接口后,要应用 ServiceContractAttribute 特性,干吗用的呢,就是指定命名空间和名称,通常这两个参数比较重要,当然,如果不指定,默认的命名空间为http://tempuri.org,默认的名称就是接口的名字。

比如本例,如果不指定名称,那默认就是 ITest,因为接口叫这个名字。

但本例中,已明确指定了命名空间和名称,并且,在操作方法上,也用 OperationContract 特性指名了服务操作的名称,对于方法参数,用 MessageParameter 特性指定了参数名字叫pcat。

服务协定的好处在于,客户端可以重新声明这个接口,但接口名字,方法名字,参数名字可以与服务器的按口不同,只要协定的命名空间,名字等对应即可。

比如,我的客户端可以这样重定义服务协定。

    [ServiceContract(
       Namespace = "http://cat.org",
       Name = "_cat")]
    interface IService
    {
        [OperationContract(Name = "say_to_cat")]
        string DoWork([MessageParameter(Name = "pcat")]string cat);
    }

虽然接口的名字和成员方法的名字不同,但可以与上面的服务协定做同一协定认定,因为它所附加的特性指明了相同的参数,并且操作方法的参数类型和返回值类型也与服务器端相同。

注意,服务协定的接口可以对客户端公开,但服务实现类不需要对外公开,因为它只在服务器上执行,你可以告诉别人银行卡号,但不要连密码也告诉别人。

好,现在用配置文件配置一下服务器,写配置文件的好处是方便修改。

  <system.serviceModel>
    <services>
      <service name="fuckServer.MyService">
        <endpoint address="http://127.0.0.1:950/catsv" binding="basicHttpBinding" contract="fuckServer.ITest"/>
      </service>
    </services>
  </system.serviceModel>

服务器基本完成,那么如何让它可以记录通信消息呢。依然是在配置文件中操作。

a、在configuration节点下写上system.diagnostics节点,这个与配置日志文件差不多。随后配置日志的source为 System.ServiceModel.MessageLogging,具体如下:

  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel.MessageLogging">
        <listeners>
          <add name="xml" type="System.Diagnostics.XmlWriterTraceListener" initializeData="wcfLog.svclog"/>
        </listeners>
      </source>
    </sources>
  </system.diagnostics>

Listeners是配置监听器,和上次我们配置日志文件一样。

b、在 system.serviceModel节点下,声明 diagnostics 节点,然后是 messageLogging 元素,并设置相关属性。

  <system.serviceModel>
    <diagnostics>
      <messageLogging logEntireMessage="true" logMalformedMessages="false" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="false" maxMessagesToLog="1000" />
    </diagnostics>
    ……
  </system.serviceModel>

logEntireMessage 值一定要为 true,这样记录器才能进入到消息内部,才能把整条消息记录下来,否则只会记录外面的空壳。

logMalformedMessages属性表示如果消息的格式不正确,是否也一起记录,可以为false,logMessagesAtServiceLevel表示是否记录服务层面的消息,这个得开启,不然一条消息都捕捉不到;logMessagesAtTransportLevel属性表示是否记录传输层的消息。

如果logMessagesAtServiceLevel开启,那么logMessagesAtTransportLevel可以为false,因为它们都会记录SOAP消息,只是层级不同罢了,当然两个都开启也无所谓。

maxMessagesToLog 表示最大条数,我设为1000,如果记录满1000条,就不再记录了。还可以指定 maxSizeOfMessageToLog 值,单位是字节,它表示日志文件的最大容量,当到达这个容量就不再记录。如果磁盘空间不够,可以指定这个值。

在配置监听器时,使用的类型为 XmlWriterTraceListener ,因为WCF日志是以XML格式存放的,指定文件名时,后缀名用.svclog,为什么呢,因为有专门的工具可以查看日志信息。

配置完成后,运行一次,就可以在\Debug目录下看到日志文件了,因为我上面配置时用的是相对路径。然后我们双击日志文件,就会以 Microsoft Service Trace Viewer 程序来打开,这个程序叫 SvcTraceViewer.exe ,在C:\Program Files (x86)\Microsoft SDKs\Windows\xxxx\bin\NETFX xxx Tools 目录下。

打开后就可以看到记录的SOAP消息了。

我只在服务器端配置了记录选项,如果你希望客户端也能记录消息,用同样的方法修改客户端的配置文件就可以了。

好了,今天的F话讲完了,但愿对大伙有0.00003%的帮助。

示例源代码下载地址

时间: 2024-08-07 11:08:59

【.net 深呼吸】记录WCF的通信消息的相关文章

[老老实实学WCF] 第九篇 消息通信模式(上) 请求应答与单向

老老实实学WCF 第九篇 消息通信模式(上) 请求应答与单向 通过前两篇的学习,我们了解了服务模型的一些特性如会话和实例化,今天我们来进一步学习服务模型的另一个重要特性:消息通信模式. WCF的服务端与客户端在通信时有三种模式:单向模式.请求/应答模式和双工模式. 如果选用了单向模式,调用方在向被调用方进行了调用后不期待任何回应,被调用方在执行完调用后不给调用方任何反馈.如客户端通过单向模式调用了一个服务端的操作后,就去干别的了,不会等待服务端给他任何响应,他也无从得知调用是否成功,甚至连发生了

Wcf 双工通信的应用

概述 双工(Duplex)模式的消息交换方式体现在消息交换过程中,参与的双方均可以向对方发送消息.基于双工MEP消息交换可以看成是多个基本模式下(比如请求-回复模式和单项模式)消息交换的组合.双工MEP又具有一些变体,比如典型的订阅-发布模式就可以看成是双工模式的一种表现形式.双工消息交换模式使服务端回调(Callback)客户端操作成为可能. 在Wcf中不是所有的绑定协议都支持回调操作,BasicHttpBinding,WSHttpBinding绑定协议不支持回调操作:NetTcpBindin

【转】WCF入门教程五[WCF的通信模式]

一.概述 WCF在通信过程中有三种模式:请求与答复.单向.双工通信.以下我们一一介绍. 二.请求与答复模式 描述: 客户端发送请求,然后一直等待服务端的响应(异步调用除外),期间处于假死状态,直到服务端有了答复后才能继续执行其他程序,如下图所示(图中的粗红线在此时代表顺序并不代表调用): 请求与答复模式为WCF的默认模式,如下代码所示: 1 [OperationContract] 2 string ShowName(string name); 即使返回值是void 也属于请求与答复模式. 缺点:

WCF系列之WCF的通信模式

一.概述 WCF在通信过程中有三种模式:请求与答复.单向.双工通信.以下我们一一介绍. 二.请求与答复模式 描述: 客户端发送请求,然后一直等待服务端的响应(异步调用除外),期间处于假死状态,直到服务端有了答复后才能继续执行其他程序,如下图所示(图中的粗红线在此时代表顺序并不代表调用): 请求与答复模式为WCF的默认模式,如下代码所示: [OperationContract] string ShowName(string name); 即使返回值是void 也属于请求与答复模式. 缺点:如果用W

Android通讯录管理(获取联系人、通话记录、短信消息)(二)

http://blog.csdn.net/wwj_748/article/details/19970271 Android通讯录管理(获取联系人.通话记录.短信消息)(二) 2014-02-26 11:40 9076人阅读 评论(11) 收藏 举报  分类: [Android通讯录模块开发](10)  版权声明:本文为博主原创文章,未经博主允许不得转载. Android通讯录管理(获取联系人.通话记录.短信消息)(二) 前言:上一篇博客介绍的是获取联系人的实现,本篇博客将介绍通话记录的实现. 同

无废话WCF入门教程五[WCF的通信模式]

一.概述 WCF在通信过程中有三种模式:请求与答复.单向.双工通信.以下我们一一介绍. 二.请求与答复模式 描述: 客户端发送请求,然后一直等待服务端的响应(异步调用除外),期间处于假死状态,直到服务端有了答复后才能继续执行其他程序,如下图所示(图中的粗红线在此时代表顺序并不代表调用): 请求与答复模式为WCF的默认模式,如下代码所示: 1 [OperationContract] 2 string ShowName(string name); 即使返回值是void 也属于请求与答复模式. 缺点:

wcf双工通信

一直以为感觉双工没弄懂,着实觉得很惆怅,在网上了解下双工的一些特点,直接上代码,以便以后项目中用的着: service层: ? 1 定义一个IDuplexHello服务接口 ? 1 2 3 4 5 6 7 8 9 10 11 [ServiceContract(       Name = "DuplexHello",       Namespace = "http://microsoft.wcf.documentation",       CallbackContra

跟我一起学WCF(1)——MSMQ消息队列

一.引言 Windows Communication Foundation(WCF)是Microsoft为构建面向服务的应用程序而提供的统一编程模型,该服务模型提供了支持松散耦合和版本管理的序列化功能,并提供了与消息队列(MSMQ).COM+.Asp.net Web服务..NET Remoting等微软现有的分布式系统技术.利用WCF平台,开发人员可以很方便地构建面向服务的应用程序(SOA).可以认为,WCF是对之前现有的分布式技术(指的是MSMQ..NET Remoting和Web 服务等技术

C# WCF的通信模式

wcf 通信模式一般分为三种; 1,请求/响应模式 2,单工模式 3,双工模式 一,请求/响应模式 请求/响应通信是指客户端向服务端发送消息后,服务端会向客户端发送响应.这也意味着在接收到服务的响应以前,客户端不会继续执行操作. 缺点 – 如果执行操作需要很长的时间,则会降低客户端性能和响应能力. 优点 – 响应消息中可返回SOAP 错误,这表明可能在通信或处理中发生了一些与服务有关的错误状况. 例题: 如,上上节所示.直接添加WCF服务应用程序 二,单工模式 单向通信应是指通信只在一个方向进行