Проблема тайм-аута веб-API asp.net core 2 - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть .net core 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 минуты, работает нормально.Я проверил это, добавив thread.sle более или менее 2 минут.

[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.

После этой записи я обновил свой program.cs, добавив KeepAliveTimeout из 10 минут.Но это не помогло.Мой запрос все еще истекает через 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 голосов
/ 29 ноября 2018

Я понимаю, что это не отвечает конкретно на ваш вопрос, но я бы предположил, что проблема здесь заключается скорее в медленном запросе, а не в связанных тайм-аутах (ах) конвейера IIS / Postman / .Net.

ЕстьВы рассматривали возможность изменения рабочего процесса, чтобы сделать один запрос, чтобы запустить процесс, а затем опросить результат?

Например:

  1. Сделать запрос POST, чтобы запустить процессфоновый процессор управления потоками / задачами и сразу же получит некоторый идентификатор процесса, идентифицирующий ваш новый процесс.

  2. Периодически опрашивайте другую конечную точку GET, используя processId в качестве параметра, продолжая, пока вы в конечном итоге не получитерезультат после завершения процесса.

0 голосов
/ 29 ноября 2018

добавление requestTimeout в web.confg решило мое время ожидания.

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

Лучший подход - отменить запрос и затем опросить результат в соответствии с предложением @ steve-land

0 голосов
/ 28 ноября 2018

Возможно, почтальон истекает.В этом случае вы можете отрегулировать настройки Почтальона.

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

Файл -> Настройки -> Общие: Время ожидания запроса

Возможно, по умолчанию он уже равен бесконечности,не знаю, изменил ли я его вручную.

Просто мысль.

Джина

...