ASP.NET MVC пользовательская обработка ошибок Application_Error Global.asax?

У меня есть некоторый абсолютный код для определения ошибок в моем приложении MVC. В настоящее время в моем проекте мне называли контроллер Error с методами действия HTTPError404(), HTTPError500(), и General(). Они все принимают строковый параметр error. Используя или изменение кода ниже. Что лучший/надлежащий путь состоит в том, чтобы передать данные Ошибочному контроллеру для обработки? Я хотел бы иметь решение, максимально устойчивое.

protected void Application_Error(object sender, EventArgs e)
{
    Exception exception = Server.GetLastError();
    Response.Clear();

    HttpException httpException = exception as HttpException;
    if (httpException != null)
    {
        RouteData routeData = new RouteData();
        routeData.Values.Add("controller", "Error");
        switch (httpException.GetHttpCode())
        {
            case 404:
                // page not found
                routeData.Values.Add("action", "HttpError404");
                break;
            case 500:
                // server error
                routeData.Values.Add("action", "HttpError500");
                break;
            default:
                routeData.Values.Add("action", "General");
                break;
        }
        routeData.Values.Add("error", exception);
        // clear error on server
        Server.ClearError();

        // at this point how to properly pass route data to error controller?
    }
}
103
задан Some developer 13 August 2019 в 09:44
поделиться

3 ответа

Вместо того, чтобы создавать для этого новый маршрут, вы можете просто перенаправить на свой контроллер / действие и передать информацию через строку запроса. Например:

protected void Application_Error(object sender, EventArgs e) {
  Exception exception = Server.GetLastError();
  Response.Clear();

  HttpException httpException = exception as HttpException;

  if (httpException != null) {
    string action;

    switch (httpException.GetHttpCode()) {
      case 404:
        // page not found
        action = "HttpError404";
        break;
      case 500:
        // server error
        action = "HttpError500";
        break;
      default:
        action = "General";
        break;
      }

      // clear error on server
      Server.ClearError();

      Response.Redirect(String.Format("~/Error/{0}/?message={1}", action, exception.Message));
    }

Тогда ваш контроллер будет получать все, что вы хотите:

// GET: /Error/HttpError404
public ActionResult HttpError404(string message) {
   return View("SomeView", message);
}

Есть некоторые компромиссы с вашим подходом. Будьте очень осторожны с зацикливанием при такой обработке ошибок. Другое дело, что, поскольку вы проходите конвейер asp.net для обработки 404, вы создадите объект сеанса для всех этих обращений. Это может быть проблемой (производительность) для часто используемых систем.

101
ответ дан 24 November 2019 в 04:20
поделиться

Возможно, лучший способ Обработка ошибок в MVC заключается в применении атрибута HandleError к вашему контроллеру или действию и обновлению файла Shared / Error.aspx для выполнения того, что вы хотите. Объект Model на этой странице включает свойство Exception, а также ControllerName и ActionName.

6
ответ дан 24 November 2019 в 04:20
поделиться

Ошибка Application_Error с запросами Ajax. Если ошибка обработана в Action, вызываемом Ajax - он отобразит ваш Error View внутри полученного контейнера.

4
ответ дан 24 November 2019 в 04:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: