Как определить, если отладка

У меня есть консольное приложение .Net Core. В методе configure в моем startup.cs я пытаюсь проверить, включен ли отладчик или нет:

 if (HttpContext.Current.IsDebuggingEnabled)
     loggerFactory.AddConsole(Configuration);
 else
     loggerFactory.AddConsoleJson(Configuration);

HttpContext.Current.IsDebuggingEnabled не поддерживается шов в ядре .Net. Мне не удалось найти метод, который работает в ядре .net.

System.Diagnostics.DebuggableAttribute.DebuggingModes.Default тоже не работает.

Ответы

Ответ 1

HttpContext - это еще один HttpContext, чем вы использовали, так как теперь вы используете ASP.NET Core. Это свойство не может быть найдено в варианте ASP.NET Core. Объяснение различий дано poke.

Я бы использовал Debugger.IsAttached, который не только проверяет, включена ли отладка, но и активно отлаживается.

Ответ 2

HttpContext.Current относится к System.Web.HttpContext, который является частью пространства имен System.Web, которое использовалось в старом ASP.NET.

Ядро ASP.NET не использует типы в пространстве имен System.Web, и все, что применяется в старом мире ASP.NET, должно быть переоценено, будет ли оно по-прежнему работать с соответствующими новыми типами в пространстве имен Microsoft.AspNetCore.

Для HttpContext новый тип Microsoft.AspNetCore.Http.HttpContext. Однако у него нет свойства IsDebuggingEnabled, которое у старого типа было.

Причина этого в том, что старый ASP.NET был приложением, которое выполнялось внутри веб-сервера (чаще всего IIS), и этот веб-сервер предоставлял HttpContext для приложения. Поэтому вам нужно было использовать HttpContext.Current для доступа к этому контексту.

В ASP.NET Core, однако, приложение включает в себя веб-сервер, что делает приложения ASP.NET Core доступными для работы полностью независимо от этого. Теперь, когда отладка, а не привязка к родительскому веб-серверу, с ASP.NET Core, вы теперь присоединяетесь к процессу самого приложения ASP.NET Core. Именно поэтому вы обычно создаете приложения командной строки (которые содержат веб-сервер с кодом вашего приложения). И поскольку они являются нормальными (командной строкой) приложениями, вам придется использовать стандартные инструменты, чтобы выяснить, подключен ли отладчик.

Обычный способ для этого - проверить Debugger.IsAttached для этого:

if (Debugger.IsAttached)
{
    // debugger is attached
}

Однако обратите внимание, что отладчики не должны прикрепляться сразу при запуске приложения. Неплохо прикрепить отладчик позже, когда приложение уже запущено. Это важно, поскольку код в вашем Startup или WebHostBuilder будет запускаться только один раз при запуске приложения. Таким образом, возможно, что даже при подключении отладчика код, который зарегистрировал ваш поставщик протоколирования, работал в то время, когда отладчик еще не был прикреплен.

Ответ 3

Если вы хотите запустить часть кода в Debug, а не в Release, вы можете использовать директиву #if препроцессора.

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

Если вы не хотите запускать что-либо в версии версии сборки, просто не включайте блок else.