.NET HttpClient如何读取单个请求返回的多个响应?
使用.NET HttpClient读取多响应(含1xx信息性响应)的方法
可行,.NET HttpClient(.NET Core 3.0及以上版本)支持捕获HTTP规范中定义的1xx信息性临时响应,不过默认不会主动暴露这些响应,需要通过特定API获取。
核心实现方式
默认情况下,HttpClient的请求方法会自动处理1xx响应,仅返回最终的非1xx响应。要获取所有1xx临时响应,可通过HttpResponseMessage的InformationalResponses集合读取,步骤如下:
发送请求时指定合适的完成选项
使用HttpCompletionOption.ResponseHeadersRead可以在响应头返回后立即处理,无需等待响应体下载完成,更高效地捕获1xx响应(也可使用默认的ResponseContentRead,但前者更适合需要提前处理临时响应的场景)。遍历并处理1xx信息性响应
最终的HttpResponseMessage对象包含InformationalResponses集合,里面存储了所有收到的1xx临时响应,每个响应可读取状态码和响应头(1xx响应无响应体)。
代码示例
using System; using System.Net.Http; using System.Threading.Tasks; class Program { static async Task Main() { using var httpClient = new HttpClient(); var request = new HttpRequestMessage(HttpMethod.Get, "https://your-target-api.com/endpoint"); // 发送请求,指定ResponseHeadersRead选项 var finalResponse = await httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead); // 处理所有1xx信息性响应 foreach (var infoResponse in finalResponse.InformationalResponses) { Console.WriteLine($"收到信息性响应:状态码 {infoResponse.StatusCode}"); foreach (var header in infoResponse.Headers) { Console.WriteLine($" {header.Key}: {string.Join(", ", header.Value)}"); } } // 处理最终响应 Console.WriteLine($"最终响应状态码:{finalResponse.StatusCode}"); var responseContent = await finalResponse.Content.ReadAsStringAsync(); Console.WriteLine("最终响应内容:"); Console.WriteLine(responseContent); } }
注意事项
- 版本限制:
InformationalResponses属性仅在.NET Core 3.0、.NET 5及以上版本中可用,.NET Framework不支持该特性。 - 1xx响应特性:所有1xx响应都是临时响应,没有响应体,只能读取状态码和响应头信息。
内容的提问来源于stack exchange,提问作者Volker
相关产品推荐
相关产品推荐

