【问题标题】:How to set the request timeout for one controller action on IIS and IIS Express如何为 IIS 和 IIS Express 上的一个控制器操作设置请求超时
【发布时间】:2016-01-06 16:05:11
【问题描述】:

我需要在控制器中以编程方式增加应用程序中特定控制器操作的请求超时。

【问题讨论】:

    标签: c# iis asp.net-core asp.net-core-mvc iis-express


    【解决方案1】:

    到目前为止,我发现处理长时间运行的脚本(如果您的应用程序无法避免使用)的最佳方法是首先创建一个异步处理程序:

    public async Task<IActionResult> About()
        {
                var cts = new CancellationTokenSource();            
                cts.CancelAfter(180000);
                await Task.Delay(150000, cts.Token);
            return View();
        }
    

    在上面的 sn-p 中,我添加了一个取消标记,表示我的异步方法应在 180 秒后取消(即使在此示例中它永远不会延迟超过 150 秒)我添加了超时以确保我的脚本可以运行多长时间是有上限的。

    如果您运行此程序,您将收到 HTTP 错误 502.3,因为在 httpPlatform 上设置了 00:02:00 的超时。

    要延长此超时时间,请转到 wwwroot 文件夹中的 web.config 文件,并将 requestTimeout="00:05:00" 属性添加到 httpPlatform 元素。例如:

    <httpPlatform requestTimeout="00:05:00" processPath="%DNX_PATH%" arguments="%DNX_ARGS%" stdoutLogEnabled="false" startupTimeLimit="3600"/>
    

    长时间运行的脚本现在应该可以工作了。

    但是,这确实意味着任何请求都需要 5 分钟才能超时,因此您必须确保使用 CancellationToken 技巧来限制应用程序中的任何异步请求。在以前的 MVC 版本中,我们有 AsyncTimeOut 属性,您可以将其添加到控制器中,但似乎这已在 MVC6 中被删除See GitHub aspnet/mvc Issue #2044

    【讨论】:

    • 感谢您非常有趣的回答,但这对我的问题来说是不可接受的:“但这确实意味着任何请求都需要 5 分钟才能超时......”我只需要以编程方式解决无需任何 web.config 干预。
    • 据我所知,由于 IIS 代理 DNX 的方式,没有任何编程方式可以做到这一点。如果您不编辑该值,则请求将在 2 分钟后始终为 502
    • @MartinBeeby 现在添加此行会导致应用程序在启动时失败,现在默认情况下似乎没有&lt;httpplatform&gt; 节点
    猜你喜欢
    • 2011-04-19
    • 2010-10-09
    • 1970-01-01
    • 2011-09-05
    • 2019-10-14
    • 2011-11-17
    • 2018-11-05
    • 1970-01-01
    相关资源
    最近更新 更多