Раз и навсегда, каков наилучший подход к обработке ошибок, исключений и ошибок 404 в MVC - PullRequest
2 голосов
/ 05 июня 2011

Существует множество статей о SO и Интернете, в которых изящно рассматриваются 404 и исключения.

Из того, что я прочитал, лучший совет, кажется, есть маршрут для 404-х, например:

routes.MapRoute(
    "404-PageNotFound",
    "{*url}",
    new { controller = "ErrorController", action = "PageNotFound" }
    );

Тогда для других ошибок включите атрибут HandleError на контроллере и включите CustomErrors в web.config, чтобы перейти на страницу error.cshtml.

Однако я прочитал, что если вы получите исключение, которое не устанавливает HTTP-код на 500, HandleError не будет работать.

Можем ли мы наконец получить ответ / передовой опыт, который обрабатывает ошибки 404 / Exceptions / ASP.Net, где мы можем применить это ко всем нашим проектам?

Спасибо

Ответы [ 2 ]

1 голос
/ 06 июня 2011

Я использую простую настройку обработки ошибок. Красиво и просто. Более подробную информацию можно найти на http://erictopia.com/2010/04/building-a-mvc2-template-part-7-custom-web-errors-and-adding-support-for-elmah/

Установите ELMAH и обработайте все ошибки.

Далее создайте контроллер ошибок. Добавьте поймать весь маршрут так:

routes.MapRoute(
    "ErrorHandler", // Route name
    "{*path}",      // URL
    new { controller = "Error", action = "Index" }
);

Затем в web.config добавьте этот раздел:

<customErrors mode="RemoteOnly" defaultRedirect="/Error/Index">
        <error statusCode="403" redirect="/Error/NoAccess" />
        <error statusCode="404" redirect="/Error/NotFound" />
</customErrors>
0 голосов
/ 05 июня 2011

Нет необходимости настраивать маршрут 404. При запуске глобального asax-приложения установите глобальный фильтр для перехвата 404, если контроллер существует, но отсутствует действие, или если действие возвращает результат 404.

        filters.Add(new HttpNotFoundFilterAttribute { Order = 99 });

где фильтр - это атрибут ActionFilterAttribute с этим переопределением:

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.Result !=null && 
            (filterContext.Result.GetType() == typeof(HttpNotFoundResult) )
        {
            //You can transfer to a known route for example
            filterContext.Result = new TransferResult(SomeAction, SomeController);
        }
    }

А также в Application_Error, если не существует контроллера:

        Exception ex = Server.GetLastError();
        string uri = null;
        if (Context != null && Context.Request != null)
        {
            uri = Context.Request.Url.AbsoluteUri;
        }

        Exception baseEx = ex.GetBaseException();
         var httpEx = ex as HttpException;

         if ((httpEx != null && httpEx.GetHttpCode()==404) 
              || (uri != null && Context.Response.StatusCode == 404) )
             { /* do what you want. */ 
               //Example: show some known url
               Server.ClearError();
               Server.TransferRequest(transferUrl);
             }

Чтобы избежать обработки 404 для статических ресурсов, вы должны установить SP1 на Windows 7 или Windows 2008 R2 для обновления IIS7 и установить в файле web.config:

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