【问题标题】:How to get content in UTF8 from transfer-encoded in C# HttpClient?如何从 C# HttpClient 中的传输编码中获取 UTF8 格式的内容?
【发布时间】:2026-01-24 13:25:01
【问题描述】:

我有发送 HttpRequest 并以字符串形式获取 json 的代码。代码工作正常,但是当服务器启动时它包含菱形和不可读的字符串sending tranfer-encoding chunked response 我尝试使用缓冲区并将文本读入 stringBuilder 但它不能很好地工作。我在一些答案中读到 HttpWebRequest 已过时,我应该使用 HttpClient。我已经在 HttpClient 中重写了我的代码,但问题仍然存在。我在浏览器中打开网址,它工作正常,加载需要几秒钟,我没有看到传输编码块。

请检查代码,

        HttpClientHandler handler = new HttpClientHandler();
        handler.CookieContainer = cookies;

        var client = new HttpClient(handler);

        var ans = client.GetAsync(strURL).Result;
        var resStream = ans.Content.ReadAsStringAsync().Result;

我已经应用了 8192 字节缓冲区并从 SO 中读取,不适用于此代码,并在过去几个小时内尝试了来自 SO 的许多代码。请检查我的代码有什么问题。我可以在标头中设置一些内容来简单地拒绝分块 html,或者有一种方法可以从响应中读取分块 html。

【问题讨论】:

  • 我强烈怀疑这与传输编码无关。这有帮助吗:*.com/a/28131841/14357 ?
  • @spender 请检查我在代码中添加的屏幕截图,我得到这样的文本,在浏览器中粘贴相同的 url 但在 c# 中它不可读。

标签: c# httpclient chunked-encoding


【解决方案1】:

根据你的代码,返回的json不是字符串格式,是字节数组? 它与服务器端有关,服务器在发回之前是否对内容进行编码? 不好意思,我在尝试添加cmets,但是我的水平太低了,我只能发布答案,希望我的一些想法能有所帮助。

在我的项目中,服务器端,我们使用下面的代码来发送响应

public System.Net.Http.HttpResponseMessage GetServiceStatus()
{
    ......
    string sJsonRet = JsonHelper.Serialize(rspMsg);
    System.Net.Http.HttpResponseMessage resp = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.OK);
    resp.Content = new System.Net.Http.StringContent(sText,System.Text.Encoding.UTF8, "text/plain");
        return resp;        
}

客户端,你总是得到纯文本字符串,我们使用 System.Net.WebClient。

 internal void GetServiceStatusCompleted(object sender, UploadStringCompletedEventArgs e){
......
   string response = e.Result;
   if ((response != null) && (response.Length > 0))
      status = (ServiceStatusMsg)JsonHelper.Deserialize(typeof(ServiceStatusMsg), response);

}

【讨论】: