.NET 6中是否有Python response.history的等效实现?
在C#中获取HttpClient重定向历史响应及标头
在Python的requests库中,你可以通过response.history直接拿到最终响应之前的重定向历史响应列表。如果想用C#的HttpClient实现同样的功能,分两种场景处理:
.NET Core 2.1+/NET 5+ 版本(推荐)
默认HttpClient会自动处理重定向,但要捕获历史响应,需配置HttpClientHandler开启CaptureRedirects属性:
// 配置HttpClientHandler var handler = new HttpClientHandler { AllowAutoRedirect = true, MaxAutomaticRedirections = 10, // 设置允许的最大重定向次数 CaptureRedirects = true // 开启重定向历史捕获 }; // 创建HttpClient using var client = new HttpClient(handler); // 发送POST请求(根据实际需求构造请求内容) var content = new StringContent("请求内容", Encoding.UTF8, "application/json"); var response = await client.PostAsync("你的请求URI", content); // 获取重定向历史 if (response.Properties.TryGetValue("Microsoft.AspNetCore.Http.RedirectHistory", out var historyObj) && historyObj is List<RedirectRecord> redirectHistory) { foreach (var record in redirectHistory) { // 输出历史响应状态码 Console.WriteLine($"重定向状态码:{record.StatusCode}"); // 输出历史响应标头 Console.WriteLine("响应标头:"); foreach (var header in record.Headers) { Console.WriteLine($"{header.Key}: {string.Join(", ", header.Value)}"); } // 输出重定向目标地址 Console.WriteLine($"重定向地址:{record.Location}\n"); } } // 处理最终响应 var finalResponseString = await response.Content.ReadAsStringAsync(); var finalHeaders = response.Headers;
.NET Framework 版本或需要精细控制的场景
如果是.NET Framework环境,或者需要手动控制重定向逻辑,可以自定义DelegatingHandler来捕获每一次重定向响应:
// 自定义重定向跟踪Handler public class RedirectTrackingHandler : DelegatingHandler { // 存储重定向历史响应 public List<HttpResponseMessage> RedirectHistory { get; } = new List<HttpResponseMessage>(); protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { var response = await base.SendAsync(request, cancellationToken); // 判断是否为重定向响应 if ((int)response.StatusCode >= 300 && (int)response.StatusCode < 400 && response.Headers.Location != null) { // 记录当前重定向响应 RedirectHistory.Add(response); // 更新请求地址,手动发起下一次请求 request.RequestUri = new Uri(request.RequestUri, response.Headers.Location); return await SendAsync(request, cancellationToken); } // 返回最终响应 return response; } }
使用自定义Handler的代码:
using var trackingHandler = new RedirectTrackingHandler(); // 关闭自动重定向,由自定义Handler处理 using var client = new HttpClient(trackingHandler) { BaseAddress = new Uri("你的基础URI") }; var content = new StringContent("请求内容", Encoding.UTF8, "application/json"); var finalResponse = await client.PostAsync("请求路径", content); // 获取所有重定向历史响应 foreach (var historyResp in trackingHandler.RedirectHistory) { Console.WriteLine($"历史响应状态码:{historyResp.StatusCode}"); Console.WriteLine("历史响应标头:"); foreach (var header in historyResp.Headers) { Console.WriteLine($"{header.Key}: {string.Join(", ", header.Value)}"); } Console.WriteLine(); } // 处理最终响应 var finalContent = await finalResponse.Content.ReadAsStringAsync();
内容的提问来源于stack exchange,提问作者Esdras Nani
相关产品推荐
相关产品推荐

