【.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%的帮助。
【.net 深呼吸】记录WCF的通信消息的更多相关文章
- [老老实实学WCF] 第九篇 消息通信模式(上) 请求应答与单向
老老实实学WCF 第九篇 消息通信模式(上) 请求应答与单向 通过前两篇的学习,我们了解了服务模型的一些特性如会话和实例化,今天我们来进一步学习服务模型的另一个重要特性:消息通信模式. WCF的服务端 ...
- WCF入门四[WCF的通信模式]
一.概述 WCF的通信模式有三种:请求/响应模式.单向模式和双工通信. 二.请求/响应模式 请求/响应模式就是WCF的默认模式,前面几篇随笔中的示例都是这种模式,当客户端发送请求后(非异步状态下),即 ...
- WCF入门教程五[WCF的通信模式]
一.概述 WCF在通信过程中有三种模式:请求与答复.单向.双工通信.以下我们一一介绍. 二.请求与答复模式 描述: 客户端发送请求,然后一直等待服务端的响应(异步调用除外),期间处于假死状态,直到服务 ...
- 无废话WCF入门教程五[WCF的通信模式]
一.概述 WCF在通信过程中有三种模式:请求与答复.单向.双工通信.以下我们一一介绍. 二.请求与答复模式 描述: 客户端发送请求,然后一直等待服务端的响应(异步调用除外),期间处于假死状态,直到服务 ...
- Android通讯录管理(获取联系人、通话记录、短信消息)
前言:前阵子主要是记录了如何对联系人的一些操作,比如搜索,全选.反选和删除等在实际开发中可能需要实现的功能,本篇博客是小巫从一个别人开源的一个项目抽取出来的部分内容,把它给简化出来,可以让需要的朋友清 ...
- 【转】WCF入门教程五[WCF的通信模式]
一.概述 WCF在通信过程中有三种模式:请求与答复.单向.双工通信.以下我们一一介绍. 二.请求与答复模式 描述: 客户端发送请求,然后一直等待服务端的响应(异步调用除外),期间处于假死状态,直到服务 ...
- wcf中的消息模式
1请求响应模式 a.wcf中的消息模式默认是请求响应模式 b.返回值是void默认也是请求响应模式,可返回服务端的错误信息 c.客户端在请求后,当前线程停止真到接受收服务器的响应 [Opereatio ...
- 使用.net的跟踪诊断来记录wcf消息
首先在项目的config文件中定义以下结点: <system.diagnostics> <sources> <source name="System.Servi ...
- Wcf 双工通信的应用
概述 双工(Duplex)模式的消息交换方式体现在消息交换过程中,参与的双方均可以向对方发送消息.基于双工MEP消息交换可以看成是多个基本模式下(比如请求-回复模式和单项模式)消息交换的组合.双工ME ...
随机推荐
- 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...
- ASP.NET Core 之 Identity 入门(三)
前言 在上一篇文章中,我们学习了 CookieAuthentication 中间件,本篇的话主要看一下 Identity 本身. 最早2005年 ASP.NET 2.0 的时候开始, Web 应用程序 ...
- 本人提供微软系.NET技术顾问服务,欢迎企业咨询!
背景: 1:目前微软系.NET技术高端人才缺少. 2:企业很难直接招到高端技术人才. 3:本人提供.NET技术顾问,保障你的产品或项目在正确的技术方向. 技术顾问服务 硬服务项: 1:提供技术.决策. ...
- Oracle Database 12c Data Redaction介绍
什么是Data Redaction Data Redaction是Oracle Database 12c的高级安全选项之中的一个新功能,Oracle中国在介绍这个功能的时候,翻译为“数据编纂”,在EM ...
- 解决vs创建或打开C++浏览数据库文件*.sdf时发生错误的问题
VS2012, 创建或打开C++浏览数据库文件*.sdf时发生错误. IntelliSense 和浏览信息将不能用于C++项目. 请确保已安装 Microsoft SQL Server Compac ...
- PayPal高级工程总监:读完这100篇论文 就能成大数据高手(附论文下载)
100 open source Big Data architecture papers for data professionals. 读完这100篇论文 就能成大数据高手 作者 白宁超 2016年 ...
- 基于window7+caffe实现图像艺术风格转换style-transfer
这个是在去年微博里面非常流行的,在git_hub上的代码是https://github.com/fzliu/style-transfer 比如这是梵高的画 这是你自己的照片 然后你想生成这样 怎么实现 ...
- HIVE教程
完整PDF下载:<HIVE简明教程> 前言 Hive是对于数据仓库进行管理和分析的工具.但是不要被“数据仓库”这个词所吓倒,数据仓库是很复杂的东西,但是如果你会SQL,就会发现Hive是那 ...
- Sass之坑Compass编译报错
前段时间在使用Compass时遇到了其为难处理的一个坑,现记录到博客希望能帮助到各位. 一.问题: 利用Koala或者是gulp编译提示如下,截图为koala编译提示错误: 二.解决办法 从问题截图上 ...
- Android开发学习—— shape标签的使用
参考这片文章http://www.cnblogs.com/armyfai/p/5912414.html