写在前面
本文参考官方文档,使用Asp.net core 8.0 的最小API 模板项目,配置超时中间件。
超时中间件可用于所有类型的ASP.NET Core应用:最小 API、带控制器的 Web API、MVC 和 Razor Pages。请求超时的属性位于命名空间 Microsoft.AspNetCore.Http.Timeouts 中。
需要注意的是,当应用在调试模式下运行时,超时中间件不会触发。要测试超时,请运行未附加调试器的应用。
代码实现
using Microsoft.AspNetCore.Http.Timeouts;var builder = WebApplication.CreateBuilder(args);// Add services to the container.builder.Services.AddControllers();builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddRequestTimeouts();var app = builder.Build();
app.UseRequestTimeouts();// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{app.UseSwagger();app.UseSwaggerUI();
}app.UseHttpsRedirection();app.UseAuthorization();app.MapControllers();app.MapGet("/", async (HttpContext context) => {try{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(2));
// Returns "Timeout!"// 属性将终结点配置为超时
app.MapGet("/attribute",[RequestTimeout(milliseconds: 2000)] async (HttpContext context) => {try{await Task.Delay(TimeSpan.FromSeconds(10), context.RequestAborted);}catch (TaskCanceledException){return Results.Content("Timeout!", "text/plain");}return Results.Content("No timeout!", "text/plain");});app.Run();
调用示例
使用调试模式运行:
不会触发超时
非调试模式下运行
与预期一致触发了超时