您如何找到可用的调试开关?或者给出一个开关找出什么是禁用?

时间:2008-08-28 20:35:07

标签: .net app-config

在这个question中,答案是打开调试器拾取的开关,禁用导致问题的无关标头。 Microsoft帮助暗示这些切换是用户生成的,不会列出任何开关。

<configuration>
  <system.diagnostics>
    <switches>
      <add name="Remote.Disable" value="1" />
    </switches>
  </system.diagnostics>
</configuration> 

我想知道的是“Remote.Disable”的价值来源以及如何找出其他可以打开或关闭的东西。目前它只是一些配置魔法,我不喜欢魔术。

2 个答案:

答案 0 :(得分:2)

如您所料,Remote.Disable会阻止应用程序将调试信息附加到远程请求。它是在构成SOAP请求的.NET框架方法中定义的。

基本情况是这些开关可以在代码中的任何地方定义,你只需要创建一个新的System.Diagnostics.BooleanSwitch,其名称是给定的,配置文件可以控制它们。

这个特定的一个在System.ComponentModel.CompModSwitches.DisableRemoteDebugging中定义:

public static BooleanSwitch DisableRemoteDebugging
{
    get
    {
        if (disableRemoteDebugging == null)
        {
            disableRemoteDebugging = new BooleanSwitch("Remote.Disable", "Disable remote debugging for web methods.");
        }
        return disableRemoteDebugging;
    }
}

在你的情况下,它可能是从 System.Web.Services.Protocols.RemoteDebugger.IsClientCallOutEnabled()调用的,它由 System.Web.Services.Protocols.WebClientProtocol调用。 NotifyClientCallOut ,它由 System.Web.Services.Protocols.SoapHttpClientProtocol

的Invoke方法调用。

不幸的是,据我所知,没有反编译框架和

new BooleanSwitch

System.Diagnostics.Switch 类的任何其他继承者, 没有简单的方法可以知道定义了什么开关。这似乎是针对具体案例搜索msdn / google / stack overflow的情况

在这种情况下,我只使用了Reflector&amp;搜索了Remote.Disable字符串

答案 1 :(得分:1)

您可以使用Reflector搜索Switch类及其子类(BooleanSwitch,TraceSwitch等)的用法。各种开关都是按名称硬编码的,所以AFAIK在某处没有主列表。