ASP.NET Core 8.0 Preview请求超时未自动触发问题
ASP.NET Core 8.0 Preview 请求超时不触发问题排查
你配置了请求超时中间件并为端点设置1秒超时,但实际请求10秒后返回成功,未触发超时。以下是排查和解决方向:
升级至最新Preview/RC版本
ASP.NET Core 8.0早期Preview版本存在请求超时中间件的已知bug,部分版本中端点级超时未正确绑定到HttpContext.RequestAborted令牌,升级到最新Preview或候选发布版(RC)可修复该问题。确认中间件顺序
确保UseRequestTimeouts在所有端点映射(如MapGet)之前调用,你的代码中顺序正确,但后续添加其他中间件时,需保证请求超时中间件优先于端点处理逻辑执行。检查令牌是否被覆盖
排查是否有其他中间件或自定义代码修改了HttpContext.RequestAborted令牌,比如全局异常处理中间件、自定义过滤器意外替换取消令牌,导致超时信号无法传递到耗时操作。避免测试工具干扰
使用Postman、curl等工具发起请求,避免浏览器的连接复用、自动重试机制影响测试结果。例如执行:curl http://localhost:5000/
确认代码关键步骤
你的代码逻辑本身无问题,需确保以下核心配置正确:
var builder = WebApplication.CreateBuilder(args); // 注册请求超时服务 builder.Services.AddRequestTimeouts(); var app = builder.Build(); // 启用请求超时中间件(必须在端点映射前调用) app.UseRequestTimeouts(); app.MapGet("/", async (HttpContext context) => { try { // 必须将RequestAborted令牌传入耗时操作 await Task.Delay(TimeSpan.FromSeconds(10), context.RequestAborted); } catch (TaskCanceledException) { return Results.Content("Timeout!", "text/plain"); } return Results.Content("No timeout.", "text/plain"); }) // 绑定端点级超时 .WithRequestTimeout(TimeSpan.FromSeconds(1)); app.Run();
内容的提问来源于stack exchange,提问作者Arvin Yorro
相关产品推荐
相关产品推荐

