asp.net core 2 Web API超时问题

时间:2018-11-28 19:40:11

标签: c# asp.net-web-api .net-core asp.net-core-webapi

我有一个.net核心Web api,其中一个端点运行一个存储过程,该过程需要3-4分钟才能完成。 API已部署到IIS。

当我执行httpGet时,出现502 Bad Gateway错误。查看IIS日志,该错误实际上是超时。这来自IIS日志:

2018-11-28 17:24:48 10.71.12.59 GET /api/meetingreport fromDate=11/01/2018&toDate=11/30/2018&tradingGroup=All&symbol=&reviewed= 16000 - 10.6.50.61 Mozilla/5.0+(Windows+NT+6.1;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/64.0.3282.140+Safari/537.36 - 502 3 12002 120029

错误代码12202适用于ERR_WINHTTP_TIMEOUT。 2分钟后发生超时。请求时间少于2分钟即可正常运行。我通过添加超过2分钟和不足2分钟的thread.sleep进行了检查。

[HttpGet("")]
        public async Task<IActionResult> Get([FromQuery(Name = "fromDate")] DateTime fromDate, 
                    [FromQuery(Name = "toDate")] DateTime toDate, [FromQuery(Name ="tradingGroup")]string tradingGroup, [FromQuery(Name = "symbol")]string symbol, [FromQuery(Name = "reviewed")]string reviewed)
        {
            try
            {
                if (fromDate == DateTime.MinValue || toDate == DateTime.MinValue) return BadRequest("fromDate and toDate is a required Field");
                tradingGroup = tradingGroup == "All" ? tradingGroup.Replace("All", "") : tradingGroup;
                tradingGroup = tradingGroup ?? string.Empty;
                symbol = symbol ?? string.Empty;
                var result = await _meetingReportRepository.GetMeetingReport(fromDate, toDate, tradingGroup, symbol, reviewed);
                Thread.Sleep(132000); // 2.2 minutes
                    return Ok(result);
            }
            catch (Exception ex)
            {
            }
            return BadRequest($"Couldn't Genererate Report");

        }

这是来自POSTMAN的错误。

enter image description here

如何将超时时间增加到10分钟?有指针吗?没有Web.config文件。

this之后,我更新了program.cs以添加10分钟的KeepAliveTimeout。但这没有帮助。 2分钟后,我的请求仍然超时。

public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .UseKestrel( o=> { o.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(10); })
            .Build();

编辑1: 部署到IIS后,将创建一个web.config文件,其内容如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
      </handlers>
      <aspNetCore processPath="dotnet" arguments=".\project.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
    </system.webServer>
  </location>
</configuration>

我将在此处添加超时以查看是否有效。

编辑2: 添加requestTimeout可以达到目的。 IIS非常忠实于web.config :)。我的问题已解决。

<aspNetCore requestTimeout="00:20:00" processPath="dotnet" arguments=".\project.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />

3 个答案:

答案 0 :(得分:2)

我意识到这并不是专门回答您的问题,但是我建议这里的问题更多是缓慢的请求-而不是任何相关的IIS / Postman / .Net管道超时。

您是否考虑过更改工作流程以发出单个请求以启动流程,然后轮询结果?

例如

  1. 发出POST请求以在后台线程/任务管理处理器上启动进程,并立即收到某种标识您新进程的进程ID。

  2. 使用processId作为参数定期轮询另一个GET端点,直到完成该过程后您最终接收到结果。

答案 1 :(得分:2)

将requestTimeout添加到web.confg解决了我的超时问题。

<aspNetCore requestTimeout="00:20:00" processPath="dotnet" arguments=".\project.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />

更好的方法是启动请求,然后按照@ steve-land的建议轮询结果

答案 2 :(得分:0)

可能是邮递员正在超时。在这种情况下,您可以调整邮递员设置。

https://www.getpostman.com/docs/v6/postman/launching_postman/settings

文件->设置->常规:请求超时

它可能已经默认为无穷大,不知道我是否手动更改了它。

只是一个想法。

吉娜