原创地址: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>
可以看到整个
运行客户端,分别点击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/GetMessageAction> <To>http://192.168.6.47:8080/HelloService.svc/HelloServiceTo> Addressing> <HttpRequest xmlns="http://schemas.microsoft.com/2004/06/ServiceModel/Management/MessageTrace"> <Method>POSTMethod> <QueryString>QueryString> <WebHeaders> <VsDebuggerCausalityData>uIDPo0e70YqoeAJIhBNYwyqk3TgAAAAAdUnEReYNIkKGPM4fV5qHKsd96tBerBNIg+gFdw79jjIACQAAVsDebuggerCausalityData> 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-ba9b8e0b3bd8ActivityId> s:Header> <s:Body> <GetMessage xmlns="http://tempuri.org/"> <name>JFname> GetMessage> s:Body> s:Envelope> MessageLogTraceRecord>
GetMessage的response
<MessageLogTraceRecord> <HttpResponse xmlns="http://schemas.microsoft.com/2004/06/ServiceModel/Management/MessageTrace"> <StatusCode>OKStatusCode> <StatusDescription>OKStatusDescription> <WebHeaders> <Content-Encoding>Content-Encoding> <Vary>Accept-EncodingVary> <Content-Length>145Content-Length> <Content-Type>text/xml; charset=utf-8Content-Type> <Date>Thu, 16 Oct 2014 14:37:35 GMTDate> <Server>Microsoft-IIS/8.0Server> <X-Powered-By>ASP.NETX-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 JFGetMessageResult> 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/GetEmployeeAction> <To>http://192.168.6.47:8080/HelloService.svc/HelloServiceTo> Addressing> <HttpRequest xmlns="http://schemas.microsoft.com/2004/06/ServiceModel/Management/MessageTrace"> <Method>POSTMethod> <QueryString>QueryString> <WebHeaders> <VsDebuggerCausalityData>uIDPo0i70YqoeAJIhBNYwyqk3TgAAAAAdUnEReYNIkKGPM4fV5qHKsd96tBerBNIg+gFdw79jjIACQAAVsDebuggerCausalityData> 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-965b049882c6ActivityId> s:Header> <s:Body> <GetEmployee xmlns="http://tempuri.org/"> <id>1id> GetEmployee> s:Body> s:Envelope> MessageLogTraceRecord>
GetEmployee的response
<MessageLogTraceRecord> <HttpResponse xmlns="http://schemas.microsoft.com/2004/06/ServiceModel/Management/MessageTrace"> <StatusCode>OKStatusCode> <StatusDescription>OKStatusDescription> <WebHeaders> <Content-Encoding>Content-Encoding> <Vary>Accept-EncodingVary> <Content-Length>247Content-Length> <Content-Type>text/xml; charset=utf-8Content-Type> <Date>Thu, 16 Oct 2014 14:37:38 GMTDate> <Server>Microsoft-IIS/8.0Server> <X-Powered-By>ASP.NETX-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>1a:Id> <a:Name>Neil Klugmana:Name> <a:Birthdate>1930-01-31T00:00:00a: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-e2f01fcd2e4cActivityId> s:Header> <s:Body> <GetMessage xmlns="http://tempuri.org/"> <name>JFname> 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 JFGetMessageResult> 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-73e0548585fdActivityId> s:Header> <s:Body> <GetEmployee xmlns="http://tempuri.org/"> <id>1id> 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>1a:Id> <a:Name>Neil Klugmana:Name> <a:Birthdate>1930-01-31T00:00:00a: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时发送和收到的消息。