ASP.NET обработка ошибок MVC 5
мы хотим обработать 403 ошибки, 404 ошибки, все ошибки из-за MySpecialDomainException
и укажите страницу ошибок по умолчанию для всех других ошибок (включая ошибки в конфигурации IIS!). Все ошибки должны возвращать правильные представления бритвы, было бы очень приятно иметь 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, некоторые из которых, скорее всего, устарели. Среди те:
- контроллер.OnException()
- фильтр ошибка
- элемент customerrors в web.config
- работа в мировой.эйсакс в application_error для перехвата
Вопрос 1: что порекомендованный путь выполнить наши требования с ASP.NET MVC 5?
также мы хотим поймать ошибки, возникающие на хосте IIS. Вопрос 2: чтобы предотвратить, что IIS должен обрабатывать любые 404s мы думали о добавлении по умолчанию маршрут, соответствующий всем возможным URL-адресам-это рекомендуется? Лучше зарегистрироваться вместо этого для IIS 404s?
Вопрос 3: возможно ли зарегистрировать страницу ошибки IIS, которая возвращается к контроллеру, или IIS способен только ASPX / static HTML?
3 ответов
лучший способ - использовать 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");
}
}
}
нет идеального решения для всех приложений.
вы можете отобразить дружественную страницу ошибок с помощью httpErrors в интернете.конфиг. В отличие от customErrors это параметр уровня IIS и даже покажет вам дружественную страницу ошибок для ошибок, которые не изнутри ASP.NET.
для регистрации ошибок я бы рекомендовал пойти с HttpModule как ELMAH: https://code.google.com/p/elmah/
Я написал целый пост в блоге об этом и где я описаны различные способы обработки ошибок: http://dusted.коды / демистификация-aspnet-mvc-5-error-pages-and-error-logging
лучший способ обработки ошибки-расширение атрибута handleerror. Атрибут ошибки Handle имеет следующие преимущества
с HandleErrorAttribute мы получаем больше контроля над исключением обращение. HandleError позволяет нам обрабатывать ошибки по-разному для различные контроллеры и действия легко, где в Application_Error чтобы получить эту функцию, мы принимаем помощь switch loop.
Как только вы попадете в 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