打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
使用WCF的Trace与Message Log功能

 

原创地址:http://www.cnblogs.com/jfzhu/p/4030008.html

转载请注明出处

 

前面介绍过如何创建一个WCF Service http://www.cnblogs.com/jfzhu/p/4025448.html,本文介绍一下如何开启与查看WCF的Message Log和Trace Log。

 

(一)使用WCF Service Configuration Editor开启Trace与Message Log功能

如果安装了Visual Studio,我们可以使用WCF Service Configuration Editor来开启WCF的Trace和Message Log的功能。Trace和Log既可以在客户端做,也可以在服务器端做。

 

有两种方式可以打开WCF Service Configuration Editor

(1)Visual Studio Tools –> WCF Service Configuration Editor:

 

(2)直接在Solution Explorer中右键点击app.config –> Edit WCF Configuration:

 

打开WCF Service Configuration Editor后,我们需要点击

  • Enable Log Auto-Flush
  • Enable MessageLogging
  • Enable Tracing

 

还要将LogEntireMessage改为True:

 

保存配置文件,可以看到文件夹中多了两个文件,一个是message log文件,另一个是trace log文件:

 

 

(二)调用WCF Service

演示的解决方案如下:

 

Employee.cs:

namespace HelloService{    [DataContract(Namespace="http://jfzhu.com/2014/10/16/Employee")]    public class Employee    {        private int id;        private string name;        private DateTime birthdate;        [DataMember(Name="Id", Order=1)]        public int Id        {            get { return id; }            set { id = value; }        }        [DataMember(Order = 2)]        public string Name        {            get { return name; }            set { name = value; }        }        [DataMember(Order = 3)]        public DateTime Birthdate        {            get { return birthdate; }            set { birthdate = value; }        }    }}

 

IHelloService.cs

namespace HelloService{        [ServiceContract(Name = "IHelloService")]    public interface IHelloService    {        [OperationContract(Name="GetMessage")]        string GetMessage(string name);        [OperationContract]        Employee GetEmployee(int id);    }}

 

HelloService.cs

namespace HelloService{        public class HelloService : IHelloService    {        public string GetMessage(string name)        {            return "Hello " + name;        }        public Employee GetEmployee(int id)        {            return new Employee() { Id = id, Name="Neil Klugman", Birthdate=new DateTime(1930, 1, 31)};        }    }}

 

Host的web.config

<?xml version="1.0" encoding="utf-8"?><configuration>    <system.serviceModel>    <diagnostics>      <messageLogging logEntireMessage="true" logMalformedMessages="true"        logMessagesAtTransportLevel="true" />    </diagnostics>    <services>      <service name="HelloService.HelloService" behaviorConfiguration="metaBehavior">        <endpoint address="HelloService" binding="basicHttpBinding" contract="HelloService.IHelloService"></endpoint>        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint>        <host>          <baseAddresses>            <add baseAddress="http://localhost:8080"/>          </baseAddresses>        </host>      </service>    </services>    <behaviors>      <serviceBehaviors>        <behavior name="metaBehavior">          <serviceMetadata httpGetEnabled="true"/>        </behavior>      </serviceBehaviors>    </behaviors>  </system.serviceModel></configuration>


Client的Form1.cs

namespace WindowsClient{    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();        }        private void buttonGetMessage_Click(object sender, EventArgs e)        {            HelloService.HelloServiceClient client = new HelloService.HelloServiceClient();            labelGetMessage.Text = client.GetMessage(textBoxGetMessage.Text);        }        private void buttonGetEmployee_Click(object sender, EventArgs e)        {            HelloService.HelloServiceClient client = new HelloService.HelloServiceClient();            HelloService.Employee employee = client.GetEmployee(Convert.ToInt32(textBoxGetEmployee.Text));            labelId.Text = "Id: " + employee.Id.ToString();            labelName.Text = "Name: " + employee.Name;            labelBirthdate.Text = "Birthdate: " + employee.Birthdate.ToString("yyyy-MM-dd");        }    }}

 

Client的app.config

<?xml version="1.0" encoding="utf-8" ?><configuration>    <system.diagnostics>        <sources>            <source name="System.ServiceModel.MessageLogging" switchValue="Warning,ActivityTracing">                <listeners>                    <add type="System.Diagnostics.DefaultTraceListener" name="Default">                        <filter type="" />                    </add>                    <add name="ServiceModelMessageLoggingListener">                        <filter type="" />                    </add>                </listeners>            </source>            <source propagateActivity="true" name="System.ServiceModel" switchValue="Warning,ActivityTracing">                <listeners>                    <add type="System.Diagnostics.DefaultTraceListener" name="Default">                        <filter type="" />                    </add>                    <add name="ServiceModelTraceListener">                        <filter type="" />                    </add>                </listeners>            </source>        </sources>        <sharedListeners>            <add initializeData="c:\temp\helloservice\windowsclient\app_messages.svclog"                type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"                name="ServiceModelMessageLoggingListener" traceOutputOptions="Timestamp">                <filter type="" />            </add>            <add initializeData="c:\temp\helloservice\windowsclient\app_tracelog.svclog"                type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"                name="ServiceModelTraceListener" traceOutputOptions="Timestamp">                <filter type="" />            </add>        </sharedListeners>        <trace autoflush="true" />    </system.diagnostics>    <system.serviceModel>        <diagnostics>            <messageLogging logEntireMessage="true" logMalformedMessages="true"                logMessagesAtTransportLevel="true" />        </diagnostics>        <bindings>            <basicHttpBinding>                <binding name="BasicHttpBinding_IHelloService" />            </basicHttpBinding>        </bindings>        <client>            <endpoint address="http://192.168.6.47:8080/HelloService.svc/HelloService"                binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IHelloService"                contract="HelloService.IHelloService" name="BasicHttpBinding_IHelloService" />        </client>    </system.serviceModel></configuration>

 

可以看到整个<system.diagnostics>部分都是用来配置Message Log和Trace Log的。

运行客户端,分别点击GetMessage按钮和GetEmployee按钮,调用两个WCF Service。

 

 

(三)使用Microsoft Service Trace Viewer查看Message Log

使用Microsoft Service Trace Viewer来看Message Log文件app_messages.svclog(除了直接双击文件可以打开查看之外,也可以在VS Command Prompt上键入命令 SVCTRACEVIWER)。

因为调用了两次WCF Service,所以在左边面板看到两个Activity。

右边面板上面的第一条记录是Request,第二条记录是Reponse。

 

GetMessage的request

 

 

<MessageLogTraceRecord>  <Addressing xmlns="http://schemas.microsoft.com/2004/06/ServiceModel/Management/MessageTrace">    <Action>http://tempuri.org/IHelloService/GetMessage</Action>    <To>http://192.168.6.47:8080/HelloService.svc/HelloService</To>  </Addressing>  <HttpRequest xmlns="http://schemas.microsoft.com/2004/06/ServiceModel/Management/MessageTrace">    <Method>POST</Method>    <QueryString></QueryString>    <WebHeaders>      <VsDebuggerCausalityData>uIDPo0e70YqoeAJIhBNYwyqk3TgAAAAAdUnEReYNIkKGPM4fV5qHKsd96tBerBNIg+gFdw79jjIACQAA</VsDebuggerCausalityData>    </WebHeaders>  </HttpRequest>  <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">    <s:Header>      <ActivityId CorrelationId="f8f62c36-528f-40c7-9b4b-b6b45b57bedd" xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">271f2185-f90c-43b2-9086-ba9b8e0b3bd8</ActivityId>    </s:Header>    <s:Body>      <GetMessage xmlns="http://tempuri.org/">        <name>JF</name>      </GetMessage>    </s:Body>  </s:Envelope></MessageLogTraceRecord>

 

GetMessage的response

 

<MessageLogTraceRecord>  <HttpResponse xmlns="http://schemas.microsoft.com/2004/06/ServiceModel/Management/MessageTrace">    <StatusCode>OK</StatusCode>    <StatusDescription>OK</StatusDescription>    <WebHeaders>      <Content-Encoding></Content-Encoding>      <Vary>Accept-Encoding</Vary>      <Content-Length>145</Content-Length>      <Content-Type>text/xml; charset=utf-8</Content-Type>      <Date>Thu, 16 Oct 2014 14:37:35 GMT</Date>      <Server>Microsoft-IIS/8.0</Server>      <X-Powered-By>ASP.NET</X-Powered-By>    </WebHeaders>  </HttpResponse>  <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">    <s:Header></s:Header>    <s:Body>      <GetMessageResponse xmlns="http://tempuri.org/">        <GetMessageResult>Hello JF</GetMessageResult>      </GetMessageResponse>    </s:Body>  </s:Envelope></MessageLogTraceRecord>

 

GetEmployee的request

 

 

<MessageLogTraceRecord>  <Addressing xmlns="http://schemas.microsoft.com/2004/06/ServiceModel/Management/MessageTrace">    <Action>http://tempuri.org/IHelloService/GetEmployee</Action>    <To>http://192.168.6.47:8080/HelloService.svc/HelloService</To>  </Addressing>  <HttpRequest xmlns="http://schemas.microsoft.com/2004/06/ServiceModel/Management/MessageTrace">    <Method>POST</Method>    <QueryString></QueryString>    <WebHeaders>      <VsDebuggerCausalityData>uIDPo0i70YqoeAJIhBNYwyqk3TgAAAAAdUnEReYNIkKGPM4fV5qHKsd96tBerBNIg+gFdw79jjIACQAA</VsDebuggerCausalityData>    </WebHeaders>  </HttpRequest>  <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">    <s:Header>      <ActivityId CorrelationId="478b437e-923a-41bc-bbd0-fc932fa664ed" xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">0fa3ee85-87fc-4a76-8047-965b049882c6</ActivityId>    </s:Header>    <s:Body>      <GetEmployee xmlns="http://tempuri.org/">        <id>1</id>      </GetEmployee>    </s:Body>  </s:Envelope></MessageLogTraceRecord>

 

GetEmployee的response

 

 

<MessageLogTraceRecord>  <HttpResponse xmlns="http://schemas.microsoft.com/2004/06/ServiceModel/Management/MessageTrace">    <StatusCode>OK</StatusCode>    <StatusDescription>OK</StatusDescription>    <WebHeaders>      <Content-Encoding></Content-Encoding>      <Vary>Accept-Encoding</Vary>      <Content-Length>247</Content-Length>      <Content-Type>text/xml; charset=utf-8</Content-Type>      <Date>Thu, 16 Oct 2014 14:37:38 GMT</Date>      <Server>Microsoft-IIS/8.0</Server>      <X-Powered-By>ASP.NET</X-Powered-By>    </WebHeaders>  </HttpResponse>  <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">    <s:Header></s:Header>    <s:Body>      <GetEmployeeResponse xmlns="http://tempuri.org/">        <GetEmployeeResult xmlns:a="http://jfzhu.com/2014/10/16/Employee" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">          <a:Id>1</a:Id>          <a:Name>Neil Klugman</a:Name>          <a:Birthdate>1930-01-31T00:00:00</a:Birthdate>        </GetEmployeeResult>      </GetEmployeeResponse>    </s:Body>  </s:Envelope></MessageLogTraceRecord>

 

(四)使用Fiddler来查看Message Log

如果使用Fiddler来查看Message Log的话,就不需要使用WCF Service Configuration Editor开启Log功能了。下图Fiddler中左边面板的两条记录分表表示两次WCF Service的调用。

右边面板上半部分表示request,下半部分表示response,基本和Microsoft Service Trace Viewer的布局差不多。

 

 

GetMessage的调用:

 

 

 

request:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">  <s:Header>    <ActivityId CorrelationId="a0148182-42f9-421c-b7d0-7a9f3edb7364" xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">7b920c1f-51b6-4ee0-9e32-e2f01fcd2e4c</ActivityId>  </s:Header>  <s:Body>    <GetMessage xmlns="http://tempuri.org/">      <name>JF</name>    </GetMessage>  </s:Body></s:Envelope>

 

response:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">  <s:Body>    <GetMessageResponse xmlns="http://tempuri.org/">      <GetMessageResult>Hello JF</GetMessageResult>    </GetMessageResponse>  </s:Body></s:Envelope>

 

GetEmployee的调用:

 

 

 

request:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">  <s:Header>    <ActivityId CorrelationId="ee409ce5-5ac4-4526-9f24-155bdfe86b0e" xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">2968a624-c51a-4247-a4ce-73e0548585fd</ActivityId>  </s:Header>  <s:Body>    <GetEmployee xmlns="http://tempuri.org/">      <id>1</id>    </GetEmployee>  </s:Body></s:Envelope>

 

 

response:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">  <s:Body>    <GetEmployeeResponse xmlns="http://tempuri.org/">      <GetEmployeeResult xmlns:a="http://jfzhu.com/2014/10/16/Employee" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">        <a:Id>1</a:Id>        <a:Name>Neil Klugman</a:Name>        <a:Birthdate>1930-01-31T00:00:00</a:Birthdate>      </GetEmployeeResult>    </GetEmployeeResponse>  </s:Body></s:Envelope>

 

 

(五)总结

  • Visual Studio提供了自己的Message Log和Trace Log的功能,本文主要演示了如何开启他们,以及如何查看Message Log。
  • 开启这些功能可以使用WCF Service Configuration Editor。
  • 查看这些Log可以使用Microsoft Service Trace Viewer。
  • Logging功能可以在客户端做也可以在服务器端做。
  • 不使用微软提供的工具,使用Fiddler也可以监控到调用WCF Service时发送和收到的消息。 
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
WCF服务的异常消息
WebService学习整理(一)
java 实现WebService 以及不同的调用方式
WebService CXF学习(进阶篇3):对象传递
WCF之旅(9):如何在WCF中使用tcpTrace来进行Soap Trace
JAVA6开发WebService (三)——几个概念
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服