如何使用C#的HttpClient从Web分块读取数据?
分块接收Web服务返回的JSON数据
要实现流式分块接收并打印Web服务返回的JSON数据,核心是修改SendAsync的完成选项,再通过流逐块读取内容,具体操作如下:
1. 调整HttpCompletionOption参数
将原代码中的HttpCompletionOption.ResponseContentRead替换为HttpCompletionOption.ResponseHeadersRead——这个选项会让HttpClient在接收完响应头后立即返回HttpResponseMessage,而非等待整个响应体下载完成,这是流式处理的基础。
2. 流式读取并打印响应内容
通过响应的Content获取流对象,使用StreamReader循环读取缓冲区内容,实时打印每一块数据。
完整修改后的代码:
using (HttpClient httpClient = new HttpClient()) using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, url)) { string content = "{ \"exampleJson\": \"This is an example\" }"; request.Content = new StringContent(content, Encoding.UTF8, "application/json"); // 关键:使用ResponseHeadersRead开启流式处理 using (HttpResponseMessage httpResponse = await httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead)) { httpResponse.EnsureSuccessStatusCode(); // 获取响应体的流对象 using (Stream responseStream = await httpResponse.Content.ReadAsStreamAsync()) using (StreamReader reader = new StreamReader(responseStream, Encoding.UTF8)) { char[] buffer = new char[1024]; // 可根据需求调整缓冲区大小 int charsRead; // 循环读取直到流结束 while ((charsRead = await reader.ReadAsync(buffer, 0, buffer.Length)) > 0) { // 将读取到的块内容转为字符串并实时打印 string chunk = new string(buffer, 0, charsRead); Console.Write(chunk); // 使用Write避免自动换行打乱JSON结构 } } } }
关键细节说明
- 缓冲区大小:示例中用
1024,可根据数据传输量调整(比如大文件场景可用4096或更大的缓冲区)。 - 编码一致性:确保
StreamReader的编码与服务端Content-Type中声明的编码一致,UTF8是通用选择。 - 分块编码兼容:如果服务端采用
Transfer-Encoding: chunked传输,代码会自动处理底层分块逻辑,无需额外操作。
内容的提问来源于stack exchange,提问作者The Ash Bot
相关产品推荐
相关产品推荐

