我们如何找到可用的调试开关?还是给一个开关找出禁用的是什么?
在这个问题中,答案是打开由调试器选择的开关,以禁用引起问题的无关标题。 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字符串