如何记录WCF消息内容?

问题描述:

enter image description here如何记录WCF消息内容?

我认为这很简单,但我看不出如何告诉WCF记录邮件正文。我有:

<system.diagnostics> 
    <sources> 
    <source name="System.ServiceModel" switchValue="Verbose"> 
     <listeners> 
     <add type="System.Diagnostics.DefaultTraceListener" name="Default"> 
      <filter type="" /> 
     </add> 
     <add type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.EntLibLoggingProxyTraceListener,Microsoft.Practices.EnterpriseLibrary.Logging" 
      name="traceListener"> 
      <filter type="" /> 
     </add> 
     </listeners> 
    </source> 
    </sources> 
</system.diagnostics> 
<system.serviceModel> 
    <diagnostics> 
    <messageLogging logEntireMessage="true" logMalformedMessages="true" 
     logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="false" /> 
    </diagnostics> 
    ...etc.., 
    ...etc... 
</system.Model> 
<loggingConfiguration name="" tracingEnabled="true" defaultCategory="General"> 
    <listeners> 
    <add fileName="_trace-xml.log" 
       listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.XmlTraceListenerData,Microsoft.Practices.EnterpriseLibrary.Logging" 
       traceOutputOptions="None" 
       type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.XmlTraceListener,Microsoft.Practices.EnterpriseLibrary.Logging" 
     name="XML Trace Listener" />  
    ...etc... other listeners 
    </listeners> 
    ...etc... 
</loggingConfiguration> 

但我所记录的是关于消息,而不是消息正文的东西。我需要更改日志消息内容?

如果你需要消息体,你必须以编程方式自己捕捉它们。使用服务行为在IDispatchMessageInspector或IClientMessageInspector实现中安装消息检查器并捕获消息。

+0

唉。所以做这样的博客http://wcfpro.wordpress.com/2011/03/29/iclientmessageinspector/给我*一切*我需要或有更多的,我需要知道在配置或代码来记录消息体? –

+0

该链接几乎是你需要的一切。它唯一没有显示的是如何安装端点行为,这非常简单(endpoint.Behaviors.Add)。 – JohnC

+4

这个答案是错误的。为'System.ServiceModel.MessageLogging'配置一个源,并且一个监听器记录这些消息对我来说工作正常。没有必要的信息检查员。 –

就跟随这说明完美的作品对我来说:http://msdn.microsoft.com/en-us/library/ms730064.aspx

<system.diagnostics> 
<sources> 
    <source name="System.ServiceModel.MessageLogging"> 
    <listeners> 
      <add name="messages" 
      type="System.Diagnostics.XmlWriterTraceListener" 
      initializeData="c:\logs\messages.svclog" /> 
     </listeners> 
    </source> 
</sources> 
</system.diagnostics> 

<system.serviceModel> 
<diagnostics> 
<messageLogging 
    logEntireMessage="true" 
    logMalformedMessages="false" 
    logMessagesAtServiceLevel="true" 
    logMessagesAtTransportLevel="false" 
    maxMessagesToLog="3000" 
    maxSizeOfMessageToLog="2000"/> 
</diagnostics> 
</system.serviceModel> 

无需编写任何代码,这个...

+4

如果我这样做,我会得到关于WCF正在做什么的大量信息,但是没有任何有关消息的内容: –

+0

这很奇怪。你可以发布你的svcviewer.exe加载了messages.svclog并显示消息标签内容的屏幕截图吗? – kroonwijk

+0

... TraceIdentifier> 被读取的消息描述> ...系统.ServiceModel.Channels.BufferedMessage/48266778 ... MessageProperties> MessageHeaders> ExtendedData> TraceRecord> 的ApplicationData> –

我发现了一个版本的问题。当WCF服务项目针对.Net 3.5构建时,我在查看器工具中看到了完整的消息主体。针对.Net 4.0构建,我没有看到消息正文。

+1

啊啊,真让人气愤!这似乎是它!其中一个“当出现问题时你只需要它”。 –

+1

给在.NET 4.0上遇到麻烦的人。注意, 跟踪是: '' 消息是: '' HTTP://计算器.COM /问题/ 11264260/WCF-如何-DO-I-跟踪消息体 –

尝试http://www.csharptutorial.in/12/csharp-net-wcf-how-to-enable-wcf-tracing-and-messagelogging并设置logMessagesAtTransportLevel =“true”。在您的日志文件中,您可以找到<s:Body>标签。调查他们附近的文字。稍后,您可以添加新的“XmlListener”,并以更灵活的格式查找消息正文。