Мы переносим приложение для использования интегрированного режима IIS7. В библиотечном коде, который предназначен для работы в контексте HTTP-запроса или нет, мы обычно имеем такой код:
if (HttpContext.Current != null &&
HttpContext.Current.Request != null) {
// do something with HttpContext.Current.Request
} else {
// do equivalent thing without HttpContext..
}
Но в интегрированном режиме IIS7 проверка на HttpContext.Current.Request
выдает исключение всякий раз, когда этот код вызывается из Application_Start
.
protected void Application_Start(object sender, EventArgs e)
{
SomeLibrary.DoSomethingWithHttpContextCurrentDetection();
}
Результаты в:
System.Web.HttpException: запрос недоступен в этом контексте
Как определить, действительно ли запрос действительно доступен без переноса этих вызовов в обработчик исключений и принятие действий на основе того, генерируется ли исключение или нет.
Глядя на HttpContext
в рефлекторе, я вижу, что у него есть поле internal bool HideRequestResponse
, но оно внутреннее, поэтому я могу добраться до него только с отражением и хрупким. Есть ли более официальный/одобренный способ определить, можно ли называть HttpContext.Request
?
В этом сообщении блога о предмете говорится, что нельзя использовать HttpContext
, но как в общем коде библиотеки вы можете определить, нормально ли использовать HttpContext
?
Я использую описанный там work-around, который должен использовать Application_BeginRequest
и initialized
, чтобы только инициализировать один раз как часть BeginRequest
, но это должно выполняться в каждом вызывающем приложении, d предпочитают сделать код библиотеки более надежным и обрабатывать эту ситуацию независимо от того, откуда она вызвала.