web-dev-qa-db-ja.com

asp.netコア2 Web APIタイムアウトの問題

私は.netコアWeb APIを使用しており、エンドポイントの1つが、完了するまでに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分以上の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();

EDIT 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>

ここにタイムアウトを追加して、機能するかどうかを確認します。

EDIT 2:requestTimeoutを追加するとうまくいきました。 IISはweb.configに非常に忠実です:)私の問題は解決されました。

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

requestTimeoutをweb.configに追加すると、タイムアウトが解決しました。

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

より良いアプローチは、リクエストをキックオフして、@ steve-landの提案に従って結果をポーリングすることです。

1
ProgSky

これは具体的にあなたの質問に答えていないと思いますが、ここでの問題は、遅いリクエストであり、関連するIIS/Postman/.Netパイプラインタイムアウトではないことをお勧めします。

ワークフローを変更して、プロセスを開始する単一のリクエストを作成し、結果をポーリングすることを検討しましたか?

例えば。

  1. POSTリクエストを実行して、バックグラウンドスレッド/タスク管理プロセッサでプロセスを開始し、すぐに新しいプロセスを識別する何らかのプロセスIDを受け取ります。

  2. ProcessIdをパラメーターとして使用して別のGETエンドポイントを定期的にポーリングし、プロセスが完了して最終的に結果を受け取るまで継続します。

2
Steve Land

タイムアウトしているのはポストマンかもしれません。その場合は、Postman設定を調整できます。

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

ファイル->設定->一般:リクエストタイムアウト

デフォルトではすでに無限大になっている可能性があります。手動で変更したかどうかはわかりません。

ちょっとした考え。

ジーナ

0
Gina Marano