4

到目前为止,我已经尝试了以下方法 - 1)添加了用于处理超时的自定义属性。

 public class TimeOutFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        System.Web.HttpContext.Current.GetType().GetField("_timeoutState", System.Reflection.BindingFlags.Instance |
        System.Reflection.BindingFlags.NonPublic).SetValue(System.Web.HttpContext.Current, 1);

        base.OnActionExecuting(filterContext);
    }
}

在 Global.asax 中添加了以下内容

filters.Add(new TimeOutFilter());

使用 [TimeOutFilter] 属性来装饰控制器

2) 添加 AsyncTimeout 属性来装饰控制器/Action,如下所示:

[AsyncTimeout(10)]

3) 将 executionTimeout 设置为 web.config 文件中的值。

<httpRuntime targetFramework="4.5" maxRequestLength="10240" executionTimeout="10" />

4) 将 HttpContext.Server.ScriptTimeout 设置为控制器中的某个值。

HttpContext.Server.ScriptTimeout = 10;

使用第 1 点中的步骤,我能够在请求超时时将用户重定向到登录屏幕。但这不是我要找的。

当请求超时发生时,我正在寻找获取或触发异常。

如果有什么方法可以做到这一点,有人可以告诉我吗?

4

1 回答 1

1

不要使用粗鲁的线程中止行为(1) 和 (4)。

AsyncTimeout 属性 (2) 很好,但只是声明(如 web.config (3) 中的 executionTimeout)超时持续时间。

在 mvc5 的完全异步管道中,只是一种使操作超时的有效方法:使用CancellationTokens抛出!

您可以通过参数或使用Request.TimedOutTokenResponse.ClientDisconnectedToken属性获取这些令牌。

这篇博文对我帮助很大。

于 2016-11-23T08:34:39.207 回答