2

我的 MVC3 项目中有很长时间轮询控制器。它的超时设置为 30 秒。我有一个处理所有错误记录的 HandleErrorAttribute 实现。

由于 timout 引发 TimeoutException,这意味着这些将显示在日志中。

我需要在我的 HandleErrorAttribute 类得到它之前拦截这个错误并返回一个 json 对象而不是 500 错误页面。最好的方法是什么?

我这样做了,它有效

public class HandleTimeout : HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        if(filterContext.Exception is TimeoutException)
        {
            filterContext.Result = new { Timeout = true }.AsJson();
            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.StatusCode = 200;
        }

        base.OnException(filterContext);
    }
}

最好的方法?

4

2 回答 2

3

我选择了这条路线,与上面代码的不同之处在于我还检查了控制器是否为异步,因为如果我们处于长时间轮询的场景中,我们只想以这种方式处理超时。

public class HandleTimeout : HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        if(filterContext.Exception is TimeoutException && filterContext.Controller is AsyncController)
        {
            filterContext.HttpContext.Response.StatusCode = 200;
            filterContext.Result = new { Timeout = true }.AsJson();
            filterContext.ExceptionHandled = true;
        }

        base.OnException(filterContext);
    }
} 
于 2012-03-08T11:22:38.480 回答
1

最佳的概念是非常主观的。我不想谈论它,因为不同的人对它有不同的定义。对我来说,使用自定义异常过滤器是一种非常好的方法来处理这种情况,而不会用异常处理代码污染你的控制器。

于 2012-03-07T11:54:41.257 回答