如何避免MVC重置ExceptionContext.Result



我正在使用以下代码来处理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方法中缺少两件事。

  1. 您需要将ExceptionHandled属性设置为true,这样框架就不会执行正常的异常处理过程,并返回死亡页面的默认黄屏。

  2. 您需要将响应状态代码指定为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;
    }
 }

相关内容

  • 没有找到相关文章

最新更新