覆盖web.config子目录中的system.diagnostics

时间:2011-08-10 14:18:41

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

我正在尝试为单个服务启用WCF邮件跟踪(此IIS应用程序中包含的一个服务之一)。我创建了一个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配置可能无法处理?

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

试试这个: -

    <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>

答案 2 :(得分:0)

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