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

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

Метод - метод - это независимая часть кода, которая вызывается со ссылкой на некоторый объект и определяется внутри класса.

103
задан Some developer 13 August 2019 в 09:44
поделиться

5 ответов

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

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
поделиться

Чтобы ответить на начальный вопрос "как правильно передать маршрутизированные данные контроллеру ошибок?":

IController errorController = new ErrorController();
errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));

Затем в классе ErrorController реализуйте такую функцию:

[AcceptVerbs(HttpVerbs.Get)]
public ViewResult Error(Exception exception)
{
    return View("Error", exception);
}

Это выталкивает исключение во Вид. Страница просмотра должна быть объявлена так:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<System.Exception>" %>

А код для отображения ошибки:

<% if(Model != null) { %>  <p><b>Detailed error:</b><br />  <span class="error"><%= Helpers.General.GetErrorMessage((Exception)Model, false) %></span></p> <% } %>

Вот функция, которая собирает все сообщения об исключениях из дерева исключений:

    public static string GetErrorMessage(Exception ex, bool includeStackTrace)
    {
        StringBuilder msg = new StringBuilder();
        BuildErrorMessage(ex, ref msg);
        if (includeStackTrace)
        {
            msg.Append("\n");
            msg.Append(ex.StackTrace);
        }
        return msg.ToString();
    }

    private static void BuildErrorMessage(Exception ex, ref StringBuilder msg)
    {
        if (ex != null)
        {
            msg.Append(ex.Message);
            msg.Append("\n");
            if (ex.InnerException != null)
            {
                BuildErrorMessage(ex.InnerException, ref msg);
            }
        }
    }
27
ответ дан 24 November 2019 в 04:20
поделиться

Я боролся с идеей централизации глобальной обработки ошибок в приложении MVC ранее. У меня есть пост на форумах ASP.NET .

Это в основном обрабатывает все ваши ошибки приложений в Global.Asax без необходимости контроллера ошибок, украшать атрибутом [HandlerError] , или возобновляются с помощью Custruster узел в web.config.

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

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