如何在Program.cs中设置requestTimeout="00:30:00"替代web.config
问题解答
首先明确:<aspNetCore requestTimeout="00:30:00"/>是IIS ASP.NET Core模块的服务器层面配置,不属于ASP.NET Core应用内部的代码配置范畴,所以无法直接通过Program.cs来设置这个值。不过可以通过以下方式实现自动配置,避免客户手动修改web.config:
1. 发布时自动生成带requestTimeout的web.config
直接修改项目根目录的web.config模板文件(不是发布后生成的文件),添加requestTimeout属性,这样发布到客户服务器时,生成的web.config会自动包含该配置:
<?xml version="1.0" encoding="utf-8"?> <configuration> <location path="." inheritInChildApplications="false"> <system.webServer> <handlers> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" /> </handlers> <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" requestTimeout="00:30:00" hostingModel="inprocess" /> </system.webServer> </location> </configuration>
发布项目时,这个模板会被用来生成目标服务器上的web.config,客户无需手动修改。
2. 关于应用层面超时与控制器特性的问题
你之前使用的超时中间件(如UseRequestTimeouts)是应用内部的请求超时控制,和IIS模块的requestTimeout是两个不同层级的设置:
- IIS的
requestTimeout是从IIS接收请求到应用返回响应的总时长限制; - 应用中间件的超时是应用内部处理请求的时长限制。
如果要让控制器上的[RequestTimeout]特性生效,需要正确配置中间件:
// Program.cs 中配置服务 builder.Services.AddRequestTimeouts(options => { // 可选:设置默认超时策略 options.DefaultPolicy = new RequestTimeoutPolicy { Timeout = TimeSpan.FromSeconds(30) }; // 也可以添加命名策略,供控制器特性引用 options.AddPolicy("LongRunning", TimeSpan.FromMinutes(30)); }); // 中间件管道中启用超时(需放在路由中间件之前) app.UseRequestTimeouts();
之后在控制器或Action上使用特性:
// 直接指定超时时间 [RequestTimeout(TimeSpan.FromMinutes(30))] public async Task<IActionResult> LongRunningAction() { // 业务逻辑 } // 或者引用命名策略 [RequestTimeout("LongRunning")] public async Task<IActionResult> AnotherLongRunningAction() { // 业务逻辑 }
之前中间件忽略控制器超时,大概率是因为没有正确配置服务或中间件顺序错误。
内容的提问来源于stack exchange,提问作者muttBunch
相关产品推荐
相关产品推荐

