Я использую комбинацию HandleErrorAttribute и Custom Error Controller в разделе Custom Errors для обработки ошибок в приложении MVC3. Логика заключается в том, чтобы обрабатывать любые ошибки запроса Ajax через обработчик OnException в атрибуте HandleErrorAttribute, а остальные ошибки — через ErrorController. Ниже приведен код -
// Handle any ajax error via HandleErrorAttribute
public class HandleAjaxErrorAttribute : System.Web.Mvc.HandleErrorAttribute
{
public override void OnException(System.Web.Mvc.ExceptionContext filterContext)
{
filterContext.HttpContext.Response.StatusCode = (int)System.Net.HttpStatusCode.InternalServerError;
var exception = filterContext.Exception;
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
//some logic
filterContext.ExceptionHandled = true;
}
}
}
//Handle remaining errors in the Error Controller
public class ErrorController : Controller
{
protected override void HandleUnknownAction(string actionName)
{
var exception = Server.GetLastError(); //Can't get the exception object here.
//some logic
}
}
Настройки Web.config:
<customErrors mode="On" defaultRedirect="~/Error">
</customErrors>
При возникновении любого исключения, отличного от ajax, управление передается от блока OnException к HandleUnknownAction в контроллере ошибок. Однако я не могу получить объект Exception. Как я могу получить объект Exception в контроллере ошибок?
Кроме того, считаете ли вы, что этот двухэтапный подход является правильным способом обработки ошибок в MVC3? Я думал об обработке ошибок в централизованном месте с помощью обработчика событий Application_Error, но, согласно моим исследованиям, это не рекомендуемый подход для приложений MVC.