Как обращаться с ошибкой приложения ASP.NET, которая возникает при запуске приложения и передаче и отображении ошибки в представлении MVC?

Я знаю, что ASP.NET MVC имеет атрибут фильтра ошибок для обработки указанного типа ошибки. Однако эта функция не может обнаружить ошибки, возникающие при запуске приложения. Поэтому мне нужно добавить некоторый код в метод "Application_Error" для обработки этой ошибки, как в следующем коде.

public void Application_Error(object sender, EventArgs e)
{
    // At this point we have information about the error
    var ctx = HttpContext.Current;

    var exception = ctx.Server.GetLastError();

    var errorInfo =
       "<br>Offending URL: " + ctx.Request.Url +
       "<br>Source: " + exception.Source +
       "<br>Message: " + exception.Message +
       "<br>Stack trace: " + exception.StackTrace;

    ctx.Response.Write(errorInfo);

    Server.ClearError();
}

Хотя этот код будет работать нормально, когда возникает обычная ошибка приложения, например, ошибка, возникающая на странице просмотра. Тем не менее, он не работает, когда возникает ошибка при запуске приложения, поскольку объекты запроса и ответа всегда равны нулю.

Затем я попытаюсь решить этот вопрос, установив перенаправление по умолчанию в пользовательские ошибки, такие как следующий код.

<customErrors mode="On" defaultRedirect="Scripts/ApplicationError.htm"></customErrors>

К сожалению, это не сработает, потому что, когда приложение получает перенаправленный запрос, он пытается снова запустить приложение и снова выполняет исключение.

Как решить эту проблему? Кроме того, есть ли у вас другая идея для обработки этой ошибки.

Спасибо,

PS. Основная причина для создания этого обработчика, потому что я хочу отображать ошибку, когда приложение не может подключиться к другой службе, например базе данных, для кэширования данных при запуске приложения.

Ответ 1

Причина, по которой объекты Request и Response являются null внутри вашего события Application_Error, потому что событие Application_Start не связано с каким-либо пользователем, поэтому вы не можете перенаправлять его. Доступны только встроенные объекты Application и Server. Ссылка на объекты Session, Request или Response приведет к ошибке.

Одним из способов решения проблемы является использование try/catch и в блоке catch журнала ошибок и установка некоторой глобальной переменной, которая указывает на то, что во время запуска приложения что-то пошло не так. Позже Application_BeginRequest вы можете проверить эту переменную и перенаправить соответственно.