【问题标题】:Overriding system.diagnostics in a subdirectory web.config在子目录 web.config 中覆盖 system.diagnostics
【发布时间】:2011-10-24 03:31:22
【问题描述】:

我正在尝试为单个服务(此 IIS 应用程序中包含的几个服务之一)启用 WCF 消息跟踪。我创建了一个 web.config 文件,该文件与我的 .svc 文件位于同一物理目录中。我可以从此 web.config 文件配置服务,修改行为、端点等。但是,当我尝试包含包含 system.diagnostics 节点时,它似乎没有任何效果。这不会产生跟踪文件:

<?xml version="1.0"?>
<configuration>
    <system.serviceModel>    
        <services>
            <service name="My.Awesome.Wcf.Service" />
            <!-- my endpoints and behaviors are defined programmatically -->
        </services>

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

    <system.diagnostics>
        <sources>
            <source name="System.ServiceModel"
                    switchValue="Information, ActivityTracing"
                    propagateActivity="true" >
                <listeners>
                    <add name="xml"/>
                </listeners>
            </source>
            <source name="System.ServiceModel.MessageLogging">
                <listeners>
                    <add name="xml"/>
                </listeners>
            </source>
        </sources>
        <sharedListeners>
            <add name="xml"
                 type="System.Diagnostics.XmlWriterTraceListener"
                       initializeData="C:\logs\Traces.svclog" />
        </sharedListeners>
        <trace autoflush="true" />
    </system.diagnostics>
</configuration>

如果我将整个 system.diagnostics 节点从这个子目录 web.config 移到应用程序的根 web.config 中,它就会神奇地开始工作。据我所知,system.diagnostics 部分不限于应用程序的根 web.config,因为我的 machine.config 显示了此部分定义:

<section name="system.diagnostics" type="System.Diagnostics.SystemDiagnosticsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>

请注意,此定义不包含“allowDefinition”属性,根据此MSDN documentation for the section element,这意味着它可以定义为“Everywhere”,其中应包含物理子目录。我也无法在任何父 web.configs 中找到任何 system.diagnostics 定义。

有谁知道为什么这个 system.diagnostics 配置可能没有得到处理?

【问题讨论】:

    标签: .net wcf iis web-config system.diagnostics


    【解决方案1】:

    结束这个问题:真正的问题是为什么要在子文件夹级别指定 WCF 日志记录?

    WCF 托管处于 IIS 应用程序级别。您不能在根 URL 处为服务禁用 WCF 日志记录,然后在较低级别启用。如果你想模拟这样的场景,那么你需要 2 个 WCF 应用程序,一个在另一个中(在 IIS 中);在 .NET 中,它们是 2 个独立的 AppDomain。

    如果您更喜欢坚持一个 AppDomain,那么您也许可以通过创建消息过滤器来实现您想要完成的目标。请参阅msdn 中的“消息过滤器”。

    【讨论】:

      【解决方案2】:

      C:\logs\ 是否存在?如果没有,则根本不会创建日志文件。

      【讨论】:

      • 在下面查看我对尼克的评论。当 system.diagnostics 节点位于根应用程序 web.config 中(而不是子目录中的那个)时,文件创建得很好,所以我知道 IIS 可以写入目录。
      • 是的,我明白了。你说文件创建得很好。是空的吗? WCF 不会立即写入条目;有时会有延迟。您可以通过回收应用程序池来立即写入。
      • 仅当我将 system.diagnostics 节点移动到应用程序根 web.config 时才有效,这对于我的特定应用程序是不可接受的。我并不真正关心使其在该配置中工作,因为它不是我的选择。也就是说,当它像这样配置时,我确实看到了有效的日志数据。我更好奇为什么我不能将声明放在子目录中的 web.config 中。
      • 知道了。那么真正的问题是为什么要在子文件夹级别指定 WCF 日志记录?无论如何,WCF 托管都处于 IIS 应用程序级别。您不能在根 URL 处为服务禁用 WCF 日志记录,然后在较低级别启用。如果你想模拟这样的场景,那么你需要 2 个 WCF 应用程序,一个在另一个中(在 IIS 中);在 .NET 中,它们是 2 个独立的 AppDomain。这有意义吗?
      • 嗯,实现您想要的另一种方法是创建消息过滤器。请参阅msdn.microsoft.com/en-us/library/ms730064.aspx 中的“邮件过滤器”。
      【解决方案3】:

      试试这个:-

          <sources>
              <source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true">
                  <listeners>
                      <add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData="c:\temp\Traces.svclog" />
                  </listeners>
              </source>
          </sources>
      

      【讨论】:

      • 感谢您的快速响应。但是,这不起作用,仍然没有生成日志文件。
      • 也许检查应该创建日志的目标文件夹的权限?给每个人写权限?
      • 是的,它存在,我为“所有人”添加了完全访问权限。当我将 system.diagnostics 节点放在应用程序根 Web 配置而不是子目录中时,该文件在该目录中创建没有问题,因此我知道 IIS 身份可以写入该目录。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-07
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多