部署在 IIS 上的 ASP.NET Core 对长时间运行的请求返回 502 错误

Posted

技术标签:

【中文标题】部署在 IIS 上的 ASP.NET Core 对长时间运行的请求返回 502 错误【英文标题】:ASP.NET Core deployed on IIS returns 502 Error for long running requests 【发布时间】:2018-02-19 15:41:28 【问题描述】:

我有一个 ASP.NET Core 2 Web 应用程序,它托管在 Windows Server 2012 上的 IIS 10 上,没有任何负载平衡和特殊配置。对于一些耗时过长的 MVC 操作,我们会收到 502 HTTP 错误。

看到这个错误后我很震惊,因为我没有任何代理服务器等的配置。然后我记得 ASP.NET Core 是在 Kestrel 上运行的。所以我得出这个结论,这里IIS扮演代理服务器的角色,将请求转发给Kestrel。所以我认为这在某种程度上与超时配置有关,因为应用程序的其他部分运行良好。我已经搜索了关于 SO 的类似问题,但没有找到解决方案。

【问题讨论】:

github.com/aspnet/AspNetCoreModule/issues/48 Timeouts with long running ASP.NET MVC Core Controller HTTPPost Method的可能重复 长时间运行的任务应该在后台运行,尤其是当请求超时的时间过长时。你可以使用 Hangfire 之类的东西,或者在 ASP.NET Core 2.0 中,你可以使用IHostedService。在任何一种情况下,您的操作都应该安排任务,然后立即返回。然后,您可以使用 SignalR 监控状态并在任务完成时更新用户。 @ChrisPratt 谢谢克里斯。我去看看。 【参考方案1】:

默认情况下,ASP.NET Core 请求超时为 2 分钟,您可以通过设置文件中的 requestTimeout 更改它。查看更多here

requestTimeout 可选的时间跨度属性。

指定 ASP.NET Core 模块将等待的持续时间 监听 %ASPNETCORE_PORT% 的进程的响应。

默认值为“00:02:00”。

requestTimeout 必须以整分钟为单位指定,否则 默认为 2 分钟。

【讨论】:

任何其他想法......这并不能解决我的问题,请求显然会在配置的时间长度下超时并出现相同的错误。【参考方案2】:

当数据很大并且需要更多时间来执行网页时,我会遇到同样的错误,我在 web.config 中更改了 .netcore 的超时值

<?xml version="1.0" encoding="utf-8"?>
  <configuration>
    <system.webServer>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" 
           resourceType="Unspecified"/>
      </handlers>
      <aspNetCore requestTimeout="00:20:00"  processPath="%LAUNCHER_PATH%" 
          arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" 
         stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false"/>
    </system.webServer>
  </configuration>

我在现有的 web.config 文件中添加了requestTimeout="00:20:00",它可以正常工作。

参考这个url

【讨论】:

以上是关于部署在 IIS 上的 ASP.NET Core 对长时间运行的请求返回 502 错误的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 部署到 IIS 错误:不应在已部署的应用程序中启用开发环境

先定一个小目标Asp.net Core 在IIS上的托管运行

IIS在ASP.NET Core下的两种部署模式

Windows + IIS 环境部署Asp.Net Core App

ASP.NET Core部署系列一:发布到IIS上

ASP.NET Core 在 IIS 下的两种部署模式