我正在使用以下代码来处理MVC控制器中的异常:
protected override void OnException(ExceptionContext filterContext)
{
if (filterContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
{
filterContext.Result = new JsonResult
{
JsonRequestBehavior = JsonRequestBehavior.AllowGet,
Data = new { Error = true, Msj = filterContext.Exception.Message }
};
}
}
在前端,我使用angularjs($http)来执行请求。
如果我将filterContext.ExceptionHandled
设置为true,$http将执行successCallback函数,但如果我不设置,.Net将把filterContext.Result
重置为tipical黄页。
我想用errorCallback函数($http)来管理错误,但避免.Net重置JsonResult 的Data
属性
有人知道如何实现它吗?
任何帮助都将不胜感激=D
Angular $http
服务默认不发送X-Requested-With
标头。你需要明确启用它。
var app = angular.module('yourApp', []);
app.config(['$httpProvider', function ($httpProvider) {
$httpProvider.defaults.headers.common["X-Requested-With"] = 'XMLHttpRequest';
}]);
编辑:根据评论
问题是.Net替换了"Data"属性
因为您在OnException
方法中缺少两件事。
您需要将
ExceptionHandled
属性设置为true
,这样框架就不会执行正常的异常处理过程,并返回死亡页面的默认黄屏。您需要将响应状态代码指定为5xx(错误响应)。客户端库将根据返回的响应的状态代码来确定是执行成功回调还是错误回调。
下面的代码应该完全可以工作。
protected override void OnException(ExceptionContext filterContext)
{
if (filterContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
{
filterContext.Result = new JsonResult
{
JsonRequestBehavior = JsonRequestBehavior.AllowGet,
Data = new { Error = true, Msj = filterContext.Exception.Message }
};
filterContext.HttpContext.Response.StatusCode = 500;
filterContext.ExceptionHandled = true;
}
}