8

我们正在尝试设置超时,而请求只是没有超时。我们尝试了几种设置方式:

通过将它放在 web.config 中(在应用程序的 web.config 和视图文件夹中)

<httpRuntime executionTimeout="5" />

我们确保我们没有处于调试模式

<compilation debug="false" targetFramework="4.0">

我们甚至尝试在代码中设置脚本超时(即使它应该是同一件事)并添加了一个 Thread.Sleep 3 分钟(以确保我们远高于默认超时)并且此操作仍然没有超时:

public ActionResult Index()
{
    Server.ScriptTimeout = 5;
    Thread.Sleep(60 * 1000 * 3);
    return View();
}

它发生在多台机器上,我什至去创建一个全新的解决方案,只对模板进行上述更改,以及一个全新的 IIS 网站应用程序池......仍然无法超时。

我们缺少一些简单的配置设置吗?这似乎应该很容易做到......

4

1 回答 1

8

添加到最终解决方案:上面的链接有一种方法可以强制 MVC 遵守当前 HttpContext 的超时

System.Web.HttpContext.Current.GetType().GetField("_timeoutState", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue(System.Web.HttpContext.Current, 1);

因为我们希望它在每个请求上运行,我们为它创建了一个全局操作过滤器

public class Timeoutter : 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 中注册它:

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new Timeoutter());
    }

请记住,此解决方案仍然需要 web.config 中的上述 2 行

<httpRuntime executionTimeout="5" />
<compilation debug="false" targetFramework="4.0">
于 2012-07-25T20:41:11.050 回答