如何检测是否调试

时间:2018-01-26 12:29:13

标签: c# asp.net-core .net-core

我有一个.Net Core控制台应用程序。在我的startup.cs中的configure方法中,我试图测试是否启用了调试器:

 if (HttpContext.Current.IsDebuggingEnabled)
     loggerFactory.AddConsole(Configuration);
 else
     loggerFactory.AddConsoleJson(Configuration);
<。> HttpContext.Current.IsDebuggingEnabled在.Net核心中不支持接缝。我还没有找到一种适用于.net核心的方法。

System.Diagnostics.DebuggableAttribute.DebuggingModes.Default似乎也不起作用。

3 个答案:

答案 0 :(得分:38)

HttpContext是您以前使用的另一个HttpContext,因为您现在使用的是ASP.NET Core。在ASP.NET Core变体中找不到该属性。 poke给出了差异的解释。

我会使用Debugger.IsAttached,它不仅会检查是否启用了调试,还会主动进行调试。

答案 1 :(得分:5)

HttpContext.Current引用System.Web.HttpContext,它是旧ASP.NET中使用的System.Web命名空间的一部分。

ASP.NET Core不使用System.Web命名空间中的类型,并且需要重新评估在旧的ASP.NET世界中应用的任何内容,无论它是否仍适用于{{1}中的相应新类型命名空间。

对于Microsoft.AspNetCore,新类型为Microsoft.AspNetCore.Http.HttpContext。但是,它没有the old type hadHttpContext属性。

原因是旧的ASP.NET是在Web服务器(最常见的IIS)中运行的应用程序,并且该Web服务器向应用程序提供了HttpContext。因此,您必须使用IsDebuggingEnabled来访问该上下文。

然而,在ASP.NET Core中,应用程序包含 Web服务器,使ASP.NET Core应用程序能够完全独立于此运行。现在,在调试时,您现在将附加到ASP.NET Core应用程序本身的进程,而不是使用ASP.NET Core附加到父Web服务器。这也是您通常创建命令行应用程序(包含带有应用程序代码的Web服务器)的原因。由于它们是普通(命令行)应用程序,因此您必须使用标准工具来确定调试器是否已连接。

通常的方法是检查Debugger.IsAttached

HttpContext.Current

但是,请注意,在应用程序启动时,调试器不需要正确附加。稍后在应用程序运行时仅附加调试器是完全正常的。这很重要,因为if (Debugger.IsAttached) { // debugger is attached } 或您的WebHostBuilder中的代码只会在应用程序启动时运行一次。因此,即使附加了调试器,注册日志记录提供程序的代码也可能在尚未附加调试器的情况下运行。

答案 2 :(得分:-1)

If you want to run a piece of code in Debug and not in Release, you can use the #if preprocessor directive.

#if(DEBUG)
  debug code here...
#else
  release code here...
#endif

If you don't want to run anything in the release version of the build, just don't include the else block.