【问题标题】:Best way of handling timeouts with AsyncController使用 AsyncController 处理超时的最佳方法
【发布时间】:2012-03-07 11:23:24
【问题描述】:

我的 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);
    }
}

最佳方法?

【问题讨论】:

  • 无法让它工作。无法解析符号“AsJson”。你到底是在哪里找到这种方法的?我正在使用 C# 4.5
  • 啊,它是一个辅助方法,它只是吐出一个 JsonResult

标签: asp.net-mvc-3 timeoutexception asynccontroller


【解决方案1】:

我选择了这条路线,与上面代码的不同之处在于,我还检查了 Controller 是否为 Async,因为我们只想在长时间轮询的情况下以这种方式处理 Timeouts。

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);
    }
} 

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-05-21
      • 1970-01-01
      • 2021-07-05
      • 2012-11-16
      • 1970-01-01
      • 2020-11-24
      • 2012-05-16
      • 2015-03-05
      • 1970-01-01
      相关资源
      最近更新 更多