В интересах всегда показывать «дружественную» страницу ошибок пользователям, когда они посещают сайт, у меня есть уловка на странице Global.asax, большинство ошибок обрабатываются фильтрами, которые, по-видимому, являются предпочтительным методом. По большей части это работает нормально. Однако во время Application_Start событие Application_Error (по понятным причинам) не запускается.
Мое событие Application_Start содержит некоторый код инициализации, который зависит от вызова службы, поэтому легко определить точку отказа, если служба недоступна по какой-либо причине. Единственный способ, который я нашел, - это сделать следующее.
private static Exception StartUpException;
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
Initialise();
}
private void Initialise()
{
StartUpException = null;
try
{
Bootstrapper.Initialise();
}
catch (Exception ex)
{
StartUpException = ex;
}
}
Тогда у меня есть следующий код в Application_BeginRequest
protected void Application_BeginRequest(object sender, EventArgs e)
{
if (StartUpException != null)
{
HandleErrorAndRedirect(StartUpException);
HttpRuntime.UnloadAppDomain();
Response.End();
}
}
Это работает, но похоже на хитрость. Я также не уверен в последствиях вызова UnloadAppDomain или в том, что произойдет, если поступит несколько запросов. Есть ли лучший способ справиться с этим?
GlobalFilters.Filters
включаетHandleError
? Если да, то это отлавливает все ошибки. - person alexn   schedule 29.04.2013