使用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时发送和收到的消息。