我们如何找到可用的调试开关?还是给一个开关找出禁用的是什么?

时间:2020-03-05 18:44:40  来源:igfitidea点击:

在这个问题中,答案是打开由调试器选择的开关,以禁用引起问题的无关标题。 Microsoft帮助暗示这些切换是用户生成的,并且未列出任何切换。

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

我想知道的是值" Remote.Disable"来自何处,以及如何找出可以打开或者关闭的其他内容。目前这只是一些配置魔术,我不喜欢魔术。

解决方案

回答

我们可以使用Reflector搜索Switch类及其子类(BooleanSwitch,TraceSwitch等)的用途。各种开关均按名称进行硬编码,因此AFAIK的某个位置没有主列表。

回答

如我们所怀疑,Remote.Disable会阻止应用程序将调试信息添加到远程请求。它是在发出SOAP请求的.NET框架方法中定义的。

基本情况是,这些开关可以在代码中的任何位置定义,我们只需要创建一个新的System.Diagnostics.BooleanSwitch,并指定名称即可,而config文件可以控制它们。

这个特殊的定义在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的Invoke方法调用.Web.Services.Protocols.SoapHttpClientProtocol

不幸的是,据我所知,缺少反编译的框架和

new BooleanSwitch

或者System.Diagnostics.Switch类的其他任何继承者,
没有简单的方法可以知道定义了哪些开关。似乎是针对特定情况搜索msdn / google / stack溢出的一种情况

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