8.5重定向响应处理

创建于 2026 年 8 月 17 日约 2 分钟读完

在发送 HTTP 远程请求时,若目标服务器返回重定向响应(如 301 Moved Permanently302 Found 等),框架默认会自动跟随重定向。为精确处理这些情况,可参考以下方案:

  • 通过 HttpRemoteOptions 全局启用或禁用自动重定向

在发送 HTTP 远程请求时,若目标服务器返回重定向响应(如 301 Moved Permanently302 Found 等),框架默认会自动跟随重定向。要启用或禁用这一行为,可以通过以下配置进行设置:

cs
services.AddHttpRemote(builder => {})    .ConfigureOptions(options =>    {        // 设置指示请求是否应遵循重定向响应,默认 true        options.AllowAutoRedirect = false;        // 设置请求所遵循的最大重定向数,默认 50 次        options.MaximumAutomaticRedirections = 50;    });
  • 通过 HttpClient 全局启用或禁用自动重定向

若希望或不希望 HttpClient 自动处理重定向,可通过配置 HttpClientHandlerSocketsHttpHandler 来启用或禁用此功能。

cs
// 配置默认客户端services.AddHttpClient(string.Empty)    .ConfigurePrimaryHttpMessageHandler(() => new SocketsHttpHandler    {        AllowAutoRedirect = true,   // 允许自动重定向,默认为 true (允许)        MaxAutomaticRedirections = 20 // 设置最大重定向次数    });
  • 通过手动处理重定向

也可以检查响应状态码。若状态码在 300-399 范围内,表明为重定向状态码,此时可手动解析 Location 头,并使用该地址重新发送请求。

  1. 禁用 HttpClient 的自动重定向功能
cs
// 配置默认客户端services.AddHttpClient(string.Empty)    .ConfigurePrimaryHttpMessageHandler(() => new SocketsHttpHandler    {        AllowAutoRedirect = false    });
  1. 手动管理重定向流程
cs
var responseMessage = await httpRemoteService.GetAsync("https://furion.net/redirect");// 检查响应消息是否包含重定向状态码var statusCode = responseMessage.StatusCode;// 通常应使用 while 循环来进行判断,因为可能涉及多次重定向if (statusCode is HttpStatusCode.Ambiguous or HttpStatusCode.Moved or HttpStatusCode.Redirect or HttpStatusCode.RedirectMethod or HttpStatusCode.RedirectKeepVerb || (int)statusCode == 308){    // 获取重定向地址    var redirectUrl = responseMessage.Headers.Location;    if (redirectUrl != null)    {        // 用新的 URL 再次发送请求        response = await httpRemoteService.GetAsync(redirectUrl);    }}

选择哪种方法取决于您的具体需求。如果你需要更细粒度地控制每个重定向过程,比如记录日志或执行特定逻辑,那么手动处理可能是更好的选择。如果只是简单地想要让客户端自动处理所有重定向,则开启自动重定向更加方便。