问题描述
我正在尝试阅读一些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");
对此进行评论似乎可以解决我所有的问题。