YARP 请求超时

介绍

.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 握手完成后,请求超时会被禁用。