You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在超时后断开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设置,确保超时后及时释放进程资源:

  • 设置应用程序池参数:

    1. 打开IIS管理器,找到目标应用程序池
    2. 右键→高级设置
    3. 在进程模型下:设置空闲超时(如20分钟,清理闲置进程)、请求限制中的请求超时(建议与后端超时保持一致,如30秒)
    4. 启用快速失败保护:设置失败阈值(如5次)、失败间隔(如5分钟),短时间内多次超时/失败时自动回收进程
  • 设置网站连接超时:

    1. 找到目标网站→右键→高级设置
    2. 在连接下设置连接超时(如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回收进程时会启动新进程处理新请求,旧进程需处理完现有请求才退出。若需超时后立即终止旧进程:

  1. 打开应用程序池高级设置
  2. 在进程模型下,将启用重叠回收设为False

内容的提问来源于stack exchange,提问作者wiki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 04:52:25