如何记录WCF消息内容?

时间:2011-11-08 13:37:23

标签: .net wcf logging

enter image description here

我认为这很简单,但我看不出如何告诉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>

但是我记录的只是关于消息的内容,而不是消息正文。我需要更改为记录消息内容?

5 个答案:

答案 0 :(得分:34)

按照此说明完美适合我: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>

无需为此编写任何代码......

答案 1 :(得分:3)

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

答案 2 :(得分:1)

如果您需要邮件正文,则必须以编程方式自行捕获它们。使用服务行为安装消息检查器并在IDispatchMessageInspector或IClientMessageInspector的实现中捕获消息。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

您可以考虑另一种查看XML SOAP的方法-custom MessageEncoder。与类似的IDispatchMessageInspector / IClientMessageInspector的主要区别在于,它可以在较低级别上工作,因此可以捕获原始字节内容,包括格式错误的xml。

为了使用此方法实现跟踪,您需要将标准textMessageEncoding包装为custom message encoder作为新的binding element,并将该自定义绑定应用于config中的端点。

此外,您还可以看到我在项目中的工作方式示例- wrapping textMessageEncoding,日志记录encoder,自定义绑定elementconfig