Вы не должны даже использовать запрос (или ответ) в Application_Start
, поскольку приложение может быть запущено без запроса.Так что в будущем ваше приложение не будет работать даже тогда, когда другие части инфраструктуры прекратят предоставлять объект Request.
Если вы хотите просто временно взломать его, вы можете использовать Reflection (если у вас доверие выше среднего)или перехват исключения (даже если вы этого не хотите) и сохранение результата в статической переменной или, возможно, использование статической оболочки HttpContext :
Также вы можете использовать HttpRuntime.UsingIntegratedPipeline
.
Таким образом, лучший подход - это удалить зависимость ваших классов от HttpContext, когда они инициализируются, или не инициализировать их в appstart.
Каков ваш смысл использовать Request в запуске приложения в любом случае?Для статистики?Или просто сказать пользователю, что он разбудил приложение?
Отредактировано с кодом, чтобы объяснить лучше:
public static class ContextWrapper
{
public static HttpRequest Request
{
get
{
HttpContext context = HttpContext.Current;
if (context == null) return null;
if (HttpRuntime.UsingIntegratedPipeline)
{
try { return context.Request; }
catch (HttpException e) { /* Consume or log e*/ return null; }
// Do not use message comparison - .NET translates messages for multi-culture environments.
}
return context.Request;
}
}
}
И в коде:
if (ContextWrapper.Request != null) //...
Или более быстрый способ, управляемый пользователем:
public static class ContextWrapper2
{
public static bool IsIis7IntegratedAppStart { get; set; }
public static HttpRequest Request
{
get
{
if (ContextWrapper2.IsIis7IntegratedAppStart) return null;
HttpContext context = HttpContext.Current;
if (context == null) return null;
return context.Request;
}
}
}
А при запуске приложения:
protected void Application_Start(object sender, EventArgs e)
{
yourLibraryNamespace.ContextWrapper2.IsIis7IntegratedAppStart = true;
//...
yourLibraryNamespace.yourClass.Init();
//...
yourLibraryNamespace.ContextWrapper2.IsIis7IntegratedAppStart = false;
}
Вы можете отметить это поведение в своей документации, и все должно быть хорошо.AppStart-подобный контекст должен быть единственным местом, где вы получаете такое исключение.
Вы также можете реализовать IDisposable на члене и использовать его в appStart с оператором using
, чтобы не забыть установить IsIis7IntegratedAppStart = false
.