Как обработать ошибку приложения ASP.NET, которая возникает при запуске приложения и ошибке передачи и отображения в представлении MVC? - PullRequest
10 голосов
/ 09 марта 2010

Я знаю, что 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 Ответ

19 голосов
/ 09 марта 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...