Эквивалент фильтра исключений MVC в веб-формах Asp.net - PullRequest
0 голосов
/ 26 сентября 2018

В веб-формах MVC у нас есть фильтр ошибок, препятствующий IExceptionFilter.Это гарантирует, что любое исключение в приложении будет направлено сюда.

Есть ли эквивалент в ASP.Net?Метод Application_Error вызывается для всех исключений?

1 Ответ

0 голосов
/ 26 сентября 2018

Во-первых, вам следует проверить официальную документацию.

Вы спрашиваете о веб-формах, а затем ссылаетесь на ASP.NET, поэтому я не совсем уверен, что выВы спрашиваете о MVC или что-то еще, но я собираюсь взять на себя MVC.1 и 3 применяются независимо.

Я нашел хорошую статью Stackify , которая является более сжатой, которую я перефразирую здесь.Я собираюсь игнорировать обработку ошибок, которая не является глобальным решением (HandleErrorAttribute и т. Д.).

В зависимости от ваших потребностей, есть несколько вариантов работы с необработанными исключениями:

1) Общие страницы Erorr, настроенные в разделе Web.Config

<system.web>
    <customErrors mode="On" defaultRedirect="~/ErrorHandler/Index">
        <error statusCode="404" redirect="~/ErrorHandler/NotFound"/>
    </customErrors>
<system.web/>

Если вы настроили что-то похожее на код выше (заменив пути примера на пути к вашему обработчику ошибок или другим веб-страницам)Вы можете настроить страницу ошибок по умолчанию, а также страницы ошибок для каждого типа кода состояния.Если вы установите mode = "RemoteOnly", эти пользовательские страницы ошибок будут отображаться только на локальном хосте, что может быть очень полезно для отладки.

Например, в моем проекте есть следующее:

<customErrors mode="RemoteOnly" defaultRedirect="/ErrorHandler">
  <error statusCode="400" redirect="~/ErrorHandler/?errorCode=400" />
  <error statusCode="401" redirect="~/ErrorHandler/?errorCode=401" />
  <error statusCode="403" redirect="~/ErrorHandler/?errorCode=403" />
  <error statusCode="404" redirect="~/ErrorHandler/?errorCode=404" />
  <error statusCode="500" redirect="~/ErrorHandler/?errorCode=500" />
</customErrors>

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

2) Переопределить функцию OnException на контроллере

Это требует от васустановить класс интерфейса для ваших контроллеров и разработать метод переопределения для метода OnException контроллера.

Из статьи Stackify они разрабатывают класс с именем UserMvcController, который наследуется от Controller.У меня лично есть класс с именем IBaseController, который имеет этот метод, наряду с другими методами, переопределенными.

Пример простого интерфейса:

public class UserMvcController : Controller
{
   protected override void OnException(ExceptionContext filterContext)
   {
      filterContext.ExceptionHandled = true;

      //Log the error!!
      _Logger.Error(filterContext.Exception);

      //Redirect or return a view, but not both.
      filterContext.Result = RedirectToAction("Index", "ErrorHandler");
      // OR 
      filterContext.Result = new ViewResult
      {
         ViewName = "~/Views/ErrorHandler/Index.cshtml"
      };
   }
} 

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

public class IBaseController : Controller
{
    // Function to set up modal pup with Error styling
    public void Error(string errorHeader, string errorMessage)
    {
        ViewBag.ErrorHeader = errorHeader;
        ViewBag.ErrorMessage = errorMessage;
        ViewBag.JavaScriptHandler = "ShowErrorModal();";
    }

    // Function to set up modal pup with Informational styling
    public void Info(string infoHeader, string infoMessage)
    {
        ViewBag.InfoHeader = infoHeader;
        ViewBag.InfoMessage = infoMessage;
        ViewBag.JavaScriptHandler = "ShowInfoModal();";
    }

    // Function to override OnException method to pass exception info the ErrorController
    protected override void OnException(ExceptionContext filterContext)
    {
        filterContext.ExceptionHandled = true;

        //Redirect or return a view, but not both.
        filterContext.Result = RedirectToAction("Message", "ErrorHandler", new { area = "", errorException = filterContext.Exception.Message });
    }
}

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

3) Использовать Application_Error

В вашем файле Global.asax вы также можетеустановите функцию Application_Error () для обработки ошибок.

public class MvcApplication : System.Web.HttpApplication
{
   protected void Application_Start()
   {
      AreaRegistration.RegisterAllAreas();
      FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
      RouteConfig.RegisterRoutes(RouteTable.Routes);
      BundleConfig.RegisterBundles(BundleTable.Bundles);
   }

   protected void Application_Error()
   {
      var ex = Server.GetLastError();
      //log the error!
      _Logger.Error(ex);
   }
}

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

Заключительное замечание

Лично я предпочитаю переопределять метод OnException контроллера и обрабатывать там мои ошибки.Я обнаружил, что с помощью этого и хорошо разработанного контроллера для обработки ошибок вы можете делать некоторые мощные вещи.Есть даже больше вариантов, чем эти, но я думаю, что это поможет вам начать.

Best.

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