如何使HttpClient正确解码此站点

问题描述

我正在尝试阅读一些uri的文本内容;基本的

httpClient.GetStringAsync(uri);

在其他站点上也可以正常工作,但不适用于https://abcapplepieoptiontrades.com(响应以\ u001f开头,并且似乎其中混入了一些二进制字符)。该网站在Web浏览器和fiddler中显示良好。

然后我尝试

using (HttpResponseMessage response = httpClient.GetAsync(uri).Result)
{
  var byteArray = response2.Content.ReadAsByteArrayAsync().Result;
  response = Encoding.UTF8.GetString(byteArray,byteArray.Length);
}

但是那也不起作用;结果与使用httpClient.GetStringAsync()时相同。我尝试了Encoding。*中列出的所有解码,但没有一个起作用。如何获得此Uri正确解码的文本内容

解决方法

起初我并不认为@Nkosi的建议会奏效,因为Fiddler对我自己的httpclient请求的响应的观点很好(所以我认为这只是一个解码问题,很高兴弄清楚Fiddler如何成功解码了我的请求的回复)。但是,尝试之后,添加所有这些标头确实会导致httpClient.GetStringAsync()工作。除了用户代理-接受语言,接受,接受编码外,我还必须添加其他标头。但是最后,这奏效了。

编辑:我讲得太早了。似乎有很多混淆的问题。我注意到添加标头后,该问题再次发生,但仅适用于某些网站(我认为它们都运行IIS)。真正让我感到困惑的是,当Fiddler捕获流量时,一切工作正常。如果不是这样,问题中描述的问题就会显现出来。

然后,我发现引起问题的网站正在压缩响应,而httpClient并没有自动将其解压缩。我修改了httpClient的创建,如下所示:

HttpClient httpClient = new HttpClient(new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate });

这似乎可以解决某些网站的问题,但不是全部。 然后我记得,当尝试如上所述模仿网络浏览器的标头时,我使用了:

httpClient.DefaultRequestHeaders.AcceptEncoding.ParseAdd("gzip,deflate,br");

对此进行评论似乎可以解决我所有的问题。