如何在IIS和IIS Express上为一个控制器操作设置请求超时

Sta*_*sac 6 c# iis iis-express asp.net-core-mvc asp.net-core

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

Mar*_*eby 5

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

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

在上面的代码片段中,我添加了一个取消标记,表示我的异步方法应在 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"/>
Run Code Online (Sandbox Code Playgroud)

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

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

  • 据我所知,由于 IIS 是 DNX 的代理,所以没有编程方法可以做到这一点。如果您不编辑该值,则请求将在 2 分钟后始终为 502 (2认同)