如果一個請求在ASP.NET Core中運行太久,會導致請求超時,目前ASP.NET Core對請求超時的設置比較麻煩,本文列出目前收集到的一些方法,供大家參考。
部署ASP.NET Core到IIS的設置方法
如果你的ASP.NET Core項目是部署在IIS上的,那么可以在ASP.NET Core項目發布后生成的web.config文件中,進行如下設置:
<?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>
通過添加aspNetCore節點和設置requestTimeout屬性,可以將請求的超時時間設置為你想要的值,上面就設置為了20分鍾。
雖然不知道requestTimeout的最大值可以設置到多少,但是試了下設置到100小時30分鍾是沒有問題的
requestTimeout="100:30:00"
如果一個Http請求100小時都還沒執行完那也是可以了。。。但是也不要把requestTimeout設置得非常大(例如1000小時),那樣IIS會報錯。
在Visual Studio中使用IIS Express調試時的設置方法
一般在使用Visual Studio調試ASP.NET Core時,我們都會選擇IIS Express作為Web服務器,下面就介紹下如何在IIS Express中設置web.config文件的超時時間。
在Windows任務欄上選中IIS Express:
右擊IIS Express圖標,選擇Show all applications:
在彈出的窗口列表中,選中你要更改超時時間的application,然后點擊底部的Config鏈接,這樣會打開站點的applicationhost.config文件。
然后在aspNetCore節點上應用requestTimeout屬性即可:
requestTimeout="00:20:00"
例如:
<system.webServer> <handlers> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" /> </handlers> <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" forwardWindowsAuthToken="false" requestTimeout="00:20:00" stdoutLogEnabled="false" /> <httpCompression> <dynamicCompression> <add mimeType="text/event-stream" enabled="false" /> </dynamicCompression> </httpCompression> </system.webServer>
最后保存applicationhost.config文件即可。
在代碼層面設置超時時間
我們還可以在ASP.NET Core的代碼層面,通過在項目Program.cs文件中添加.UseKestrel(...)到BuildWebHost方法中,來設置KeepAliveTimeout屬性的值,從而設置請求的超時時間,可以結合上面介紹的web.config中的requestTimeout屬性來一起做設置。
public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .UseKestrel(option => { option.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(20); option.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(20); }) .Build();