介绍
.NET 8 引入了请求超时中间件,以便全局以及对每个终结点配置请求超时。 在 .NET 8 或更高版本上运行时,YARP 2.1 中也提供此功能。
默认值
默认情况下,请求没有任何超时,只是用活动超时来清理空闲请求。 RequestTimeoutOptions 中指定的默认策略也适用于代理请求。
配置
可以通过 RouteConfig 为每个路由指定超时和超时策略,并且可以从配置文件的 Routes 部分绑定超时和超时策略。 与其他路由属性一样,无需重启代理即可修改和重新加载此属性。 策略名称不区分大小写。
超时时间以 TimeSpan 格式(HH:MM:SS)指定。 在同一路由上同时指定 Timeout 和 TimeoutPolicy 无效,将导致配置被拒绝。
请注意,当调试器附加到进程时,请求超时不适用。
示例:
{
"ReverseProxy": {
"Routes": {
"route1" : {
"ClusterId": "cluster1",
"TimeoutPolicy": "customPolicy",
"Match": {
"Hosts": [ "localhost" ]
}
}
"route2" : {
"ClusterId": "cluster1",
"Timeout": "00:01:00",
"Match": {
"Hosts": [ "localhost2" ]
}
}
},
"Clusters": {
"cluster1": {
"Destinations": {
"cluster1/destination1": {
"Address": "https://localhost:10001/"
}
}
}
}
}
}
超时策略和默认策略可以在服务集合中配置,并且可以按如下方式添加中间件:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddReverseProxy()
.LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));
builder.Services.AddRequestTimeouts(options =>
{
options.AddPolicy("customPolicy", TimeSpan.FromSeconds(20));
});
var app = builder.Build();
app.UseRequestTimeouts();
app.MapReverseProxy();
app.Run();
禁用超时
在路由的 disable 参数中指定值 TimeoutPolicy 意味着请求超时中间件不会对此路由应用超时。
WebSocket协议
初始 WebSocket 握手完成后,请求超时会被禁用。