【问题标题】:How to log WCF message content?如何记录 WCF 消息内容?
【发布时间】:2011-12-24 11:22:07
【问题描述】:

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

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

【问题讨论】:

    标签: .net wcf logging


    【解决方案1】:

    只要遵循这个描述对我来说就完美了: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>
    

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

    【讨论】:

    • 如果我这样做,我会得到大量关于 WCF 正在做什么的信息,但对消息的内容一无所知:
    • grrr。无论如何,上面试图证明'process action'getBlah'和'sent a message over a channel'条目的svclog元素实际上并没有记录有问题的消息,而只是有一个空的 和没有 MessageBody 或任何类似的东西。其他跟踪项,例如“已写入消息”和“已收到 Http 响应”也不包含消息信息。不知道如何发布屏幕截图。
    • 已发布屏幕截图,尽管您需要几个来证明没有任何跟踪记录包含消息正文?昨天花了一些时间在谷歌上搜索后,我得到的印象是 JohnC 是正确的,并且像 msdn.microsoft.com/en-us/library/… 这样的东西是博客倾向于模仿的解决方案。如果有影响,我在 Net3.5 上
    • 好的:我确认消息选项卡(在左上角的活动、项目、消息、图表选项卡组中)为空。 (就像右下角的 Formatted-Xml-Message 选项卡组中的 Message 选项卡一样)。我们可以假设 logEntireMessage 只适用于 VS2010/.Net 4;并且在 Vs2008/.Net 3 中不起作用;这就是为什么在 JohnC 的回复所指示的路线上出现大量博客和 MS 杂志文章的原因。或者我错过了一些重要的事情;但是我的配置与您在答案中指出的相同,但对我不起作用。
    • 这行得通。您可能需要增加 maxSizeOfMessageToLog
    【解决方案2】:

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

    【讨论】:

    • 啊,太烦人了!这似乎是它!...其中之一“只有在出现问题时才需要它”。
    • 致在 .Net 4.0 上遇到此问题的人们。注意,Tracing 是:&lt;source name="System.ServiceModel"&gt; Messages 是:&lt;source name="System.ServiceModel.MessageLogging"&gt; stackoverflow.com/questions/11264260/…
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 唉。那么像这个博客wcfpro.wordpress.com/2011/03/29/iclientmessageinspector 这样的东西是否给了我我需要的一切,或者我需要在配置或代码方面了解更多信息以记录消息正文吗?
      • 这个链接几乎就是你需要的一切。它唯一没有显示的是如何安装端点行为,这很容易(endpoint.Behaviors.Add)。
      • 这个答案是错误的。为System.ServiceModel.MessageLogging 配置源和记录消息的侦听器对我来说很好。不需要消息检查器。
      • 错了!正如@TomW 所说,您可以简单地配置一个源来接收消息。
      • 对于其他倾向于将此答案称为错误并声称这一切都只适用于配置的人,我建议您参考@RichardHowells 的回答:“我发现了一个版本控制问题。当 WCF 服务项目针对 .Net 3.5 构建时,我在查看器工具中看到了完整的消息正文。针对 .Net 4.0 构建,我没有看到任何消息正文。”
      【解决方案5】:

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

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

      你也可以看看我在我的项目中是如何做到的—— wrapping textMessageEncoding,记录 encoder,自定义绑定 elementconfig

      【讨论】:

        猜你喜欢
        • 2020-04-15
        • 2011-01-08
        • 2010-12-01
        • 1970-01-01
        • 2010-10-28
        • 1970-01-01
        • 1970-01-01
        • 2012-03-08
        • 1970-01-01
        相关资源
        最近更新 更多