【问题标题】:HttpClient.GetAsync returns weird result for some websitesHttpClient.GetAsync 为某些网站返回奇怪的结果
【发布时间】:2021-10-09 07:08:11
【问题描述】:

请考虑这个简单的代码:

private async void button3_Click(object sender, EventArgs e)
{
    textBox1.Text = "It begins...";
    await DoAsync_Button3();
}

private async Task DoAsync_Button3()
{
    HttpClient client = new HttpClient();
    HttpResponseMessage response = await client.GetAsync("https://www.stackoverflow.com/");
    response.EnsureSuccessStatusCode();
    string responseBody = await response.Content.ReadAsStringAsync();
    textBox1.Text = responseBody;
}

和简单的用户界面:

问题是对于某些网站,我得到了一些奇怪的结果。例如:https://www.dotnetperls.com/

我得到了这个结果:

我得到了奇怪的结果,而 StatusCode 是 200。我如何确定问题出在哪里?谢谢

【问题讨论】:

  • 这段代码可以通过'using (WebClient client = new WebClient()) { string html = client.DownloadString("example.com"); }'来更简单
  • @viveknuna WebClient 在很久以前就被弃用了,绝对没有理由在新代码中使用它。 docs.microsoft.com/en-us/dotnet/api/…
  • 查看 dotnetpearls 的内容编码标头值。它向您显示了 Brotli 的 br。这告诉你,响应基本上是一个压缩字节数组。

标签: c# compression httpclient


【解决方案1】:

你需要解压响应:

HttpClient httpClient = new HttpClient(new HttpClientHandler
{
    AutomaticDecompression = System.Net.DecompressionMethods.All
});
string responseAsString = await httpClient.GetStringAsync("https://www.dotnetperls.com/");
Console.WriteLine(responseAsString);

如果您使用的是 .NET 5 或 6,则可以使用 SocketsHttpHandler 而不是 HttpClientHandler

【讨论】:

  • .NET Core 5 和 6 都不存在,产品分别称为 .NET 5 和 .NET 6。
  • HttpClientHandler 在 .NET Core 或更新版本的后台使用 SocketsHttpHandler。所以没有理由明确地提供它,除非你需要进行一些特定的设置。
猜你喜欢
  • 2012-08-08
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多