4

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

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

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

4

2 回答 2

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.WebClientProtocol.NotifyClientCallOut调用的,而后者又被 System.Web.Services.Protocols.RemoteDebugger.IsClientCallOutEnabled()调用.Web.Services.Protocols.SoapHttpClientProtocol

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

new BooleanSwitch

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

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

于 2008-08-28T23:57:57.460 回答
1

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

于 2008-08-28T23:53:10.967 回答