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

如何通过RestSharp实时获取服务器流式传输的数据?

实时读取流式服务器数据的解决方案

一、RestSharp的正确实现方式

你的问题出在ResponseWriter的设计逻辑和DownloadDataAsync的特性上:ResponseWriter确实会在响应流完全接收完成后才被调用一次,而DownloadDataAsync会把整个响应数据下载完毕后才返回,没法实现实时读取。

要在RestSharp里实现实时流式读取,需要用ExecuteAsync配合响应流的异步循环读取,而非DownloadDataAsync。具体实现:

  1. 执行请求后直接获取响应流,循环异步读取直到流结束
  2. 确保服务器启用分块传输(返回Transfer-Encoding: chunked响应头),否则客户端仍会等待完整数据

示例代码:

var restClient = new RestClient("http://127.0.0.1:8000/my_api");
var request = new RestRequest("get_data");

using var response = await restClient.ExecuteAsync(request);
using var responseStream = response.ResponseStream;
using var reader = new StreamReader(responseStream, Encoding.UTF8);

char[] buffer = new char[1024];
int bytesRead;
while ((bytesRead = await reader.ReadAsync(buffer, 0, buffer.Length)) > 0)
{
    string chunk = new string(buffer, 0, bytesRead);
    Console.WriteLine($"实时收到数据:{chunk}");
}

如果使用较旧版本的RestSharp,可改用ExecuteStreamAsync方法直接获取响应流,避免数据被缓存。

二、用HttpClient实现流式读取(更直观)

如果RestSharp的方式不够顺手,HttpClient原生支持流式响应的实时处理,代码逻辑更直接:

using var httpClient = new HttpClient();
// 关键:仅读取响应头就返回,不等完整响应体
using var response = await httpClient.GetAsync(
    "http://127.0.0.1:8000/my_api/get_data", 
    HttpCompletionOption.ResponseHeadersRead
);
response.EnsureSuccessStatusCode();

using var responseStream = await response.Content.ReadAsStreamAsync();
using var reader = new StreamReader(responseStream, Encoding.UTF8);

char[] buffer = new char[1024];
int bytesRead;
while ((bytesRead = await reader.ReadAsync(buffer, 0, buffer.Length)) > 0)
{
    string chunk = new string(buffer, 0, bytesRead);
    Console.WriteLine($"实时收到数据:{chunk}");
}

关键注意事项

  • 服务器必须启用分块传输编码,否则客户端会一直等待完整数据,无法实时获取
  • 读取流时务必使用异步方法(ReadAsync),避免阻塞主线程
  • 用using语句管理流和客户端对象,确保资源正确释放

内容的提问来源于stack exchange,提问作者theateist

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 10:04:59