ASP.NET Core で Timeout を伸ばしたい場合

ASP.NET Core でやむにやまれず、処理を中断させず最後まで走らせてその結果を画面に応答させるために実行時間タイムアウトを延長したくなる場合があります。日本語でも英語でもヒットしづらくで、その話。

ようは、Web なので本来は全ての処理はショートに終わらせるべきで、長時間処理するなら非同期的にやって、キューなりに入れて裏でバッチ的に処理すべきなんだけど、ちょっとした都合で、あぁちょっとだけ、5分とか、しれっと伸ばしたいの、というときの話です。

本記事は http://qiita.com/advent-calendar/2016/asp-net の11日目です。

結論から

web.config の以下を指定すれば、延長することが出来ます。

<system.webServer>
<handlers>
<add name="aspNetCore"
path="*"
verb="*"
modules="AspNetCoreModule"
resourceType="Unspecified"/>
</handlers>
<aspNetCore processPath="%LAUNCHER_PATH%"
arguments="%LAUNCHER_ARGS%"
stdoutLogEnabled="false"
stdoutLogFile=".\logs\stdout"
forwardWindowsAuthToken="false"
requestTimeout="00:05:00"/>
</system.webServer>

注意点なんですが、秒の部分を指定すると、何故か IIS が接続先のプロセス起動する際に失敗するようで。IIS 側は HTTP Error 502.3 — Bad Gateway を応答します。時を指定?それは流石にアレやないですかね。

なんですが

これが問題になるのは、IIS / IIS Express 経由で、つまり HttpPlatformHandler 経由で ASP.NET Core をホストする場合だけです。Internal.WebHost に :5000 で繋いで走る場合にはそこそこ走り続けてくれるので、その環境で試しに以下のような乱暴なコードで 310 sec 秒分とか待たせてみても、走り続けて応答します。

[Route("[controller]/[action]/{sec}")]
public async Task<IActionResult> Index(int sec)
{
await Task.Delay(sec * 1000);
return View();
}

なので

Azure App Service Web Apps (Windows) で動かす場合でタイムアウトを延長したければ、IIS で HttpPlatformHandler 環境なのでこの設定を実施、App Service Web Apps for Linux の場合、試してないですが、何もしなくてもそこそこの間は動き続けると思います。多分ですが。

英語で検索してると、なんかこう、うまく意志疎通が出来てないように見える QA をみたりするのですが、開発環境が Linux 側なのか Windows 側なのか、また IIS / IIS Express での HttpPlatformHanddler 利用なのかで振る舞いが違うので、意思疎通が難しいようです。