Я использую интегрированный режим IIS 7 и получаю
Запрос недоступен в этом контексте
когда я пытаюсь получить к нему доступ в функции, связанной с Log4Net, которая вызывается из Application_Start
. Это строка кода, которую я
if (HttpContext.Current != null && HttpContext.Current.Request != null)
и создается исключение для второго сравнения.
Что еще я могу проверить, кроме проверки HttpContext.Current.Request на null ??
Аналогичный вопрос размещен @ Request is not available in this context exception when runnig mvc on iis7.5
но и там нет соответствующего ответа.
Ответы:
См. Интегрированный режим IIS7: запрос недоступен в этом исключении контекста в Application_Start :
источник
Когда у вас есть настраиваемая логика ведения журнала, довольно неприятно быть вынужденным либо не регистрировать application_start, либо допускать возникновение исключения в регистраторе (даже если оно обработано).
Похоже, что вместо проверки на
Request
доступность вы можете проверитьHandler
доступность: когда ее нетRequest
, было бы странно иметь обработчик запросов. И тестированиеHandler
не вызывает этого ужасногоRequest is not available in this context
исключения.Таким образом, вы можете изменить свой код на:
Остерегайтесь, в контексте модуля http,
Handler
хотя они могут не быть определеныRequest
иResponse
определены (я видел это в событии BeginRequest). Поэтому, если вам нужна регистрация запросов / ответов в настраиваемом модуле http, мой ответ может не подойти.источник
Это очень классический случай: если в конечном итоге вам придется проверять какие-либо данные, предоставленные экземпляром http, подумайте о перемещении этого кода в
BeginRequest
событие.Это подходящее место для проверки заголовков http, строки запроса и т. Д.
Application_Start
Для настроек, которые применяются для всего времени выполнения приложения, таких как маршрутизация, фильтры, ведение журнала и так далее.Пожалуйста, не применяйте никаких обходных решений, таких как статический .ctor или переключение в классический режим, если нет возможности переместить код из файла
Start
вBeginRequest
. это должно быть выполнимо для подавляющего большинства ваших случаев.источник
Поскольку во время запуска приложения в конвейере больше нет контекста запроса, я не могу представить, как можно угадать, на каком сервере / порту может прийти следующий фактический запрос. Вы должны сделать это на Begin_Session.
Вот что я использую, когда не в классическом режиме. Накладные расходы незначительны.
источник
На основе подробных требований OP, описанных в комментариях , существует более подходящее решение. OP заявляет, что он желает добавить пользовательские данные в свои журналы с помощью log4net, данные, связанные с запросами.
Вместо того чтобы оборачивать каждый вызов log4net в настраиваемый централизованный вызов журнала, который обрабатывает получение данных, связанных с запросом (при каждом вызове журнала), log4net предоставляет контекстные словари для настройки дополнительных данных для регистрации. Использование этих словарей позволяет разместить данные журнала запросов для текущего запроса в событии BeginRequest, а затем отклонить его в событии EndRequest. Эти пользовательские данные будут полезны любому входу между ними.
А то, что не происходит в контексте запроса, не будет пытаться регистрировать данные, связанные с запросом, устраняя необходимость проверки доступности запроса. Это решение соответствует принципу, который предлагал Арман МакХитарян в своем ответе .
Для того, чтобы это решение работало, вам также потребуется дополнительная настройка ваших приложений log4net, чтобы они могли регистрировать ваши пользовательские данные.
Это решение можно легко реализовать в виде настраиваемого модуля расширения журнала. Вот пример кода для этого:
Добавьте его на свой сайт, пример конфигурации IIS 7+:
И настройте приложения для регистрации этих дополнительных свойств, пример конфигурации:
источник
Вы можете обойти проблему, не переключаясь в классический режим, и по-прежнему использовать Application_Start
По какой-то причине статический тип создается с запросом в его HTTPContext, что позволяет сохранить его и сразу же повторно использовать в событии Application_Start.
источник
Я смог решить эту проблему, перейдя в «классический» режим из «интегрированного» режима.
источник
У меня это сработало - если вам нужно войти в Application_Start, сделайте это, прежде чем изменять контекст. Вы получите запись в журнале без источника, например:
2019-03-12 09: 35: 43,659 INFO (null) - Приложение запущено
Обычно я регистрирую как Application_Start, так и Session_Start, поэтому я увижу более подробную информацию в следующем сообщении.
2019-03-12 09: 35: 45,064 INFO ~ / Leads / Leads.aspx - Сессия началась (локально)
источник
В Visual Studio 2012, когда я опубликовал решение по ошибке с опцией «отладка», я получил это исключение. С опцией «релиз» этого не произошло. Надеюсь, поможет.
источник
Вы можете использовать следующее:
источник
сделайте это в global.asax.cs:
работает как шарм. this.Context.Request есть ...
this.Request намеренно генерирует исключение на основе флага
источник