如何在超时后断开ASP.NET Core Web API 6请求并终止工作进程?
在IIS 10中处理ASP.NET Core 6 Web API超时后终止请求与进程处理的方案
一、启用ASP.NET Core请求超时中间件并绑定取消令牌
ASP.NET Core 6+内置请求超时中间件,可在超时后自动触发请求取消令牌,让后端业务逻辑感知超时并终止处理。
全局配置请求超时:
在Program.cs中添加并配置中间件:var builder = WebApplication.CreateBuilder(args); // 注册请求超时服务 builder.Services.AddRequestTimeouts(); var app = builder.Build(); // 启用请求超时中间件 app.UseRequestTimeouts(); // 全局设置默认超时时间(示例为30秒) app.UseRequestTimeouts(new RequestTimeoutOptions { DefaultPolicy = new RequestTimeoutPolicy { Timeout = TimeSpan.FromSeconds(30) } }); // 其他中间件配置... app.Run();针对特定端点单独设置超时:
在控制器方法上使用[RequestTimeout]特性:[ApiController] [Route("api/[controller]")] public class TestController : ControllerBase { // 该接口单独设置超时为20秒 [HttpGet] [RequestTimeout(20)] public async Task<IActionResult> GetData(CancellationToken cancellationToken) { // 将取消令牌传递给业务逻辑方法 await BusinessLogic.DoHeavyWork(cancellationToken); return Ok(); } }业务逻辑中监听取消令牌:
在耗时操作中定期检查令牌状态,或传递给支持取消的异步方法:public static class BusinessLogic { public static async Task DoHeavyWork(CancellationToken cancellationToken) { for (int i = 0; i < 100; i++) { // 若已取消则抛出异常终止流程 cancellationToken.ThrowIfCancellationRequested(); // 模拟耗时操作,同时传递取消令牌 await Task.Delay(100, cancellationToken); } } }
二、配置IIS层面的超时与进程回收策略
配合IIS设置,确保超时后及时释放进程资源:
设置应用程序池参数:
- 打开IIS管理器,找到目标应用程序池
- 右键→高级设置
- 在进程模型下:设置空闲超时(如20分钟,清理闲置进程)、请求限制中的请求超时(建议与后端超时保持一致,如30秒)
- 启用快速失败保护:设置失败阈值(如5次)、失败间隔(如5分钟),短时间内多次超时/失败时自动回收进程
设置网站连接超时:
- 找到目标网站→右键→高级设置
- 在连接下设置连接超时(如30秒),超时后IIS自动断开客户端连接
三、确保异步操作响应取消
所有耗时异步操作(数据库查询、HTTP请求、文件IO等)必须传递CancellationToken,否则无法响应取消信号。例如EF Core查询:
public async Task<List<Data>> GetDataFromDb(CancellationToken cancellationToken) { using var dbContext = new AppDbContext(); // 将取消令牌传递给EF Core查询 return await dbContext.Data.ToListAsync(cancellationToken); }
四、禁用重叠回收(可选)
默认IIS回收进程时会启动新进程处理新请求,旧进程需处理完现有请求才退出。若需超时后立即终止旧进程:
- 打开应用程序池高级设置
- 在进程模型下,将启用重叠回收设为
False
内容的提问来源于stack exchange,提问作者wiki
相关产品推荐
相关产品推荐

