【问题标题】:WCF: How do I trace message bodies?WCF:如何跟踪邮件正文?
【发布时间】:2023-03-29 03:13:01
【问题描述】:

我正在尝试诊断在相对简单的服务宿主进程 (Service.exe) 中自托管的 WCF 服务。

我已经这样配置了 Service.exe.config:

<?xml version="1.0" ?>
<configuration>
  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel" 
              switchValue="All"
              propagateActivity="true">
        <listeners>
          <add name="traceListener" 
               type="System.Diagnostics.XmlWriterTraceListener" 
               initializeData= "c:\temp\Service.svclog" />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>
  <system.serviceModel>
    <diagnostics>
      <messageLogging maxMessagesToLog="1"
                      maxSizeOfMessageToLog="2147483647"
                      logEntireMessage="true"
                      logMessagesAtServiceLevel="true"
                      logMalformedMessages="true"
                      logMessagesAtTransportLevel="true">
      </messageLogging>
    </diagnostics>
  </system.serviceModel>
  <startup>
    <supportedRuntime version="v4.0"
                      sku=".NETFramework,Version=v4.0" />
  </startup>
</configuration>

当我查看生成的 svclog 文件时,我看到记录了许多跟踪事件(我希望只记录第一条消息),并且所有被跟踪的消息都没有显示消息正文(只有标头)。

我确定我在这里一定遗漏了一些简单的东西,但我没有看到它。

更新:当我查看 WCF 配置编辑器时,“诊断”下有两个部分:消息记录和跟踪。当我单击“EnableMessageLogging”链接时,我的配置文件会更新:

  <system.diagnostics>
    <sources>
      <source propagateActivity="true" name="System.ServiceModel" switchValue="All">
        <listeners>
          <add type="System.Diagnostics.DefaultTraceListener" name="Default">
            <filter type="" />
          </add>
          <add initializeData="c:\temp\MessageBodyTracing.svclog" type="System.Diagnostics.XmlWriterTraceListener"
            name="traceListener">
            <filter type="" />
          </add>
        </listeners>
      </source>
      <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>
    </sources>
    <sharedListeners>
      <add initializeData="c:\users\me\documents\visual studio 2010\projects\messagebodytracing\messagebodytracing\app_messages.svclog"
        type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
        name="ServiceModelMessageLoggingListener" traceOutputOptions="Timestamp">
        <filter type="" />
      </add>
    </sharedListeners>
  </system.diagnostics>

我猜名为 System.ServiceModel.MessageLogging 的源是关键 - 我在任何消息跟踪文档中都没有看到...

【问题讨论】:

  • 为什么是maxMessagesToLog="1"?是故意的吗?
  • 是的,我想看看 部分中的任何内容是否生效,但似乎没有。

标签: wcf logging trace


【解决方案1】:

尝试添加:

<endToEndTracing propagateActivity="true" activityTracing="true" messageFlowTracing="true" />

在您的diagnostics 节点中,在messageLogging 下。

【讨论】:

  • 没有帮助。我什至用你在创建新的 WCF 服务库项目时获得的“Hello World”服务尝试过这个,我也没有在那里记录消息正文。困惑。
  • 您是否尝试过使用 VS 中的 WCF 配置编辑器并查看为您的服务 .config 生成了什么?
【解决方案2】:

在服务配置编辑器的 Diagnostics->MessageLogging 下将 LogEntireMessage 设置为 true

【讨论】:

  • 这只是让它在查看器中显示“...流...”
  • @Joe Phillips TransferMode 设置为流式传输。仅当将 TransferMode 设置为 Buffered 时,跟踪才有效!您必须更改配置。
猜你喜欢
  • 2020-08-26
  • 2010-11-08
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2016-05-17
  • 1970-01-01
  • 2011-11-14
  • 1970-01-01
相关资源
最近更新 更多