如何让 HttpClient 忽略 Content-Length 标头

2023-12-22

我正在使用 HttpClient 与我无权访问的服务器进行通信。有时,来自服务器的 JSON 响应会被截断。

当 Content-Length 标头小于应有的长度(8192 与 8329)时,就会出现问题。这似乎是服务器上的一个错误,它提供了比响应正文的实际大小更小的内容长度标头。如果我使用 Google Chrome 而不是 HttpClient,则响应始终是完整的。

因此,我想让 HttpClient 忽略错误的 Content-Length 标头并读取到响应的末尾。可以这样做吗?任何其他解决方案都将受到高度赞赏。谢谢你!

这是我的 HttpClient 的代码:

var client = new HttpClient();
client.BaseAddress = new Uri(c_serverBaseAddress);

HttpResponseMessage response = null;
try
{
      response = await client.GetAsync(c_serverEventApiAddress + "?location=" + locationName);
}
catch (Exception e)
{
    // Do something
}
var json = response.Content.ReadAsStringAsync().Result;

var obj = JsonConvert.DeserializeObject<JObject>(json); // The EXCEPTION occurs HERE!!! Because the json is truncated!

EDIT 1:

如果我使用 HttpWebRequest,它可以完全读取 JSON 响应的末尾,而不会出现任何截断。但是,我想使用 HttpClient,因为它有更好的异步/等待。

这是使用 HttpWebRequest 的代码:

var url = c_serverBaseAddress + c_serverEventApiAddress + "?location=" + "Saskatchewan";

var request = (HttpWebRequest)WebRequest.Create(url); 
request.ProtocolVersion = HttpVersion.Version10;
request.Method = "GET";
request.ContentType = "application/x-www-form-urlencoded";

var response = (HttpWebResponse)request.GetResponse();

StringBuilder stringBuilder = new StringBuilder(); 
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
      string line;
      while ((line = reader.ReadLine()) != null)
      {
            stringBuilder.Append(line);
      }
}
var json = stringBuilder.ToString();  // COMPLETE json response everytime!!!

您可以尝试指定响应内容的缓冲区大小

var client = new HttpClient();
client.MaxResponseContentBufferSize = <your_buffer_size>;

其中属性 MaxResponseContentBufferSize 的含义是:

获取或设置读取响应内容时要缓冲的最大字节数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让 HttpClient 忽略 Content-Length 标头 的相关文章

随机推荐