摘要:对于最小API应用,可以通过调用WithRequestTimeout或者用[RequestTimeout]属性来配置终结点超时。app.MapGet("/", async (HttpContext context) => {try{await Task.Del
在ASP.NET Core中,超时中间件允许为HTTP请求设置超时限制,以提高应用程序的健壮性和响应能力。
需要在的服务集合中添加请求超时中间件,再将其添加到请求处理管道中。
using Microsoft.AspNetCore.Http.Timeouts;var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRequestTimeouts;// 添加到服务集合
var app = builder.Build;
app.UseRequestTimeouts;// 添加到请求处理管道对于最小API应用,可以通过调用WithRequestTimeout或者用[RequestTimeout]属性来配置终结点超时。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));// 设置超时时间为2秒
也可以使用属性的方式:
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");
});也可以创建命名策略来指定超时配置,这些配置可以应用于多个终结点。通过调用AddPolicy添加策略:builder.Services.AddRequestTimeouts(options => {
options.DefaultPolicy =
new RequestTimeoutPolicy { Timeout = TimeSpan.FromMilliseconds(1500) };
options.AddPolicy("MyPolicy", TimeSpan.FromSeconds(2));
});
可以通过策略名称为终结点指定超时:
app.MapGet("/namedpolicy", async (HttpContext context) => {//设置10s任务
return Results.Content("No timeout!", "text/plain");
}).WithRequestTimeout("MyPolicy");// 使用命名策略
也可以为全局默认超时配置指定一个策略:
builder.Services.AddRequestTimeouts(options => {options.DefaultPolicy =
new RequestTimeoutPolicy { Timeout = TimeSpan.FromMilliseconds(1500) };
});
默认超时将适用于没有指定超时的终结点。
builder.Services.AddRequestTimeouts(options => {options.DefaultPolicy = new RequestTimeoutPolicy
{
Timeout = TimeSpan.FromMilliseconds(1500),
TimeoutStatusCode = (int)HttpStatusCode.InternalServerError
};
});每个超时的请求都将具有状态码500(内部服务器错误)。有时可能想要禁用特定终结点的默认超时策略。对于最小API,可以使用[DisableRequestTimeout]属性app.MapGet("/GetCharacter",
[DisableRequestTimeout] async (HttpContext context, ICharacterService characterService) => { return await characterService.GetCharacterAsync(context.RequestAborted);
});[HttpGet("GetCharacter")]
[DisableRequestTimeout]
public async TaskGetCharacterAsync
=> await _characterService.GetCharacterAsync(HttpContext.RequestAborted);
通过合理配置超时策略,可以确保应用程序在处理时间上保持健壮和响应性。
来源:opendotnet
免责声明:本站系转载,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与本站联系,我们将在第一时间删除内容!