Обработка ошибок ASP.NET MVC 5
Мы хотим обработать 403 ошибки, 404 ошибки, все ошибки из-за MySpecialDomainException
и предоставить страницу ошибок по умолчанию для всех других ошибок (включая ошибки в конфигурации IIS!). Все ошибки должны возвращать правильные виды Razor, было бы очень приятно иметь ErrorController
перед представлениями. Например:
public class ErrorController : Controller
{
public ViewResult NotFound () { return View(); }
public ViewResult Forbidden () { return View(); }
public ViewResult Default ()
{
var ex = ObtainExceptionFromSomewhere();
if(ex is MySpecialDomainException)
return View("MySpecialDomainException", new ErrorModel { Exception = ex });
return View("GeneralError", new ErrorModel { Exception = ex });
}
}
В настоящее время вы найдете много разных способов сделать это на www, некоторые, скорее всего, устарели. Среди них:
- Controller.OnException()
- Фильтр ошибок
- элемент customErrors в web.config
- Обработка в приложении Global.asax Application_Error
Q1: Каков рекомендуемый способ выполнения наших требований с помощью ASP.NET MVC 5?
Также мы хотим поймать ошибки, происходящие на хосте IIS. Q2: Чтобы IIS не работал с любыми 404, мы думали о добавлении маршрута по умолчанию, соответствующего всем возможным URL-адресам, - это рекомендуется? Лучше зарегистрироваться вместо этого для 404-го ИИС?
Q3: Возможно ли зарегистрировать страницу ошибок IIS, которая возвращается к контроллеру, или IIS, способный только ASPX/статический HTML?
Ответы
Ответ 1
Лучший способ - использовать Global.Asax, потому что вы можете управлять всеми типами ошибок (Ajax-вызовы/все непредвиденные ошибки). с другими вы не можете этого сделать.
Вот так:
protected void Application_Error()
{
HttpContext httpContext = HttpContext.Current;
if (httpContext != null)
{
RequestContext requestContext = ((MvcHandler)httpContext.CurrentHandler).RequestContext;
/* When the request is ajax the system can automatically handle a mistake with a JSON response.
Then overwrites the default response */
if (requestContext.HttpContext.Request.IsAjaxRequest())
{
httpContext.Response.Clear();
string controllerName = requestContext.RouteData.GetRequiredString("controller");
IControllerFactory factory = ControllerBuilder.Current.GetControllerFactory();
IController controller = factory.CreateController(requestContext, controllerName);
ControllerContext controllerContext = new ControllerContext(requestContext, (ControllerBase)controller);
JsonResult jsonResult = new JsonResult
{
Data = new { success = false, serverError = "500" },
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
jsonResult.ExecuteResult(controllerContext);
httpContext.Response.End();
}
else
{
httpContext.Response.Redirect("~/Error");
}
}
}
Ответ 2
Для всех приложений нет золотого решения.
Вы можете отобразить дружественную страницу ошибки, используя httpErrors в web.config. В отличие от customErrors это параметр уровня IIS и даже покажет вам дружественную страницу ошибок для ошибок, которые не входят в ASP.NET.
Для регистрации ошибок я бы рекомендовал пойти с HttpModule как ELMAH:
https://code.google.com/p/elmah/
Я написал целую запись в блоге об этом и объяснил различные способы обработки ошибок:
http://dusted.codes/demystifying-aspnet-mvc-5-error-pages-and-error-logging
Ответ 3
Лучшим способом обработки ошибок является расширение атрибута handleerror.
Атрибут ошибки обработки имеет следующие преимущества.
-
С HandleErrorAttribute мы получаем больше контроля над исключением
обработки. HandleError позволяет нам обрабатывать ошибки по-разному для
различные контроллеры и действия легко, где в Application_Error
для получения этой функции мы берем на себя помощь петли переключения.
-
Как только вы попадете в Application_Error, вы находитесь вне MVC, и вы
потерять ControllerContext, и тогда мы не сможем сделать много вещей, которые будут
легко с помощью HandleError.
см. следующее сообщение о том, как расширить атрибут обработки ошибок и преимущества
Преимущества [HandleError] над Application_Error
http://maheshde.blogspot.com.au/2012/09/error-handing-with-mvc-using-custom.html
http://www.codeproject.com/Articles/731913/Exception-Handling-in-MVC