如何在新的ASP.NET MVC应用程序中最好地创建基本 Controller ,该应用程序将包含样板代码来处理派生 Controller 中每个 Action 的所有try/catch例程,并在登录Nlog后返回标准JSON错误消息。我还想处理404错误以重定向到自定义404 View 。我的目标是使用OWIN Cookie身份验证,并希望在Cookie过期时退出。我所有的操作都将返回JsonResult并通过jQuery Ajax调用。
在以前的项目中,我使用了以下方法:
用Global.asax.cs
protected void Application_Error(object sender, EventArgs e)
{
Exception lastError = Server.GetLastError();
Server.ClearError();
var statusCode = 0;
statusCode = lastError.GetType() == typeof(HttpException) ? ((HttpException)lastError).GetHttpCode() : 500;
var routeData = new RouteData();
routeData.Values.Add("controller", "Error");
routeData.Values.Add("statusCode", statusCode);
routeData.Values.Add("exception", lastError);
if (new HttpRequestWrapper(HttpContext.Current.Request).IsAjaxRequest())
{
routeData.Values.Add("action", "Ajax");
}
else
{
routeData.Values.Add("action", "Index");
}
var requestContext = new RequestContext(new HttpContextWrapper(Context), routeData);
IController controller = new ErrorController();
controller.Execute(requestContext);
Response.End();
}
用
ErrorController.cs
public class ErrorController : Controller
{
public ActionResult Index(int statusCode, Exception exception)
{
var model = new ErrorModel { HttpStatusCode = statusCode, Exception = exception.Message };
Response.StatusCode = statusCode;
return View(model);
}
public JsonResult Ajax(int statusCode, Exception exception, Dictionary<string,string> validationErrors = null)
{
var model = new ErrorModel { HttpStatusCode = statusCode, Exception = exception.Message };
if (exception.GetType() == typeof (DbEntityValidationException))
{
model.ValidationErrors = null;
}
else
{
model.ValidationErrors = validationErrors;
}
Response.StatusCode = statusCode;
return Json(model, JsonRequestBehavior.AllowGet);
}
}
最佳答案
最好的方法是通过扩展HandleErrorAttribute
像这样:
public class AjaxAwareHandleErrorAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
// Execute the normal exception handling routine...
base.OnException(filterContext);
// Verify if AJAX request...
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
// Use Json in case of AJAX request...
var result = new JsonResult();
result.Data = new { Error = filterContext.Exception.Message };
filterContext.Result = result;
}
}
}
然后,您需要做的就是在
FilterConfig
文件夹下的App_Start
类中注册该属性,如下所示:public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new AjaxAwareHandleErrorAttribute());
}
}
关于asp.net-mvc - 在ASP.NET MVC中,如何重构try/catch并返回JSON错误消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27236428/