You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 21:15:17