【问题标题】:Skype Emoticon downloaded with C# HttpClient is a different byte stream than downloaded with browser使用 C# HttpClient 下载的 Skype Emoticon 与使用浏览器下载的字节流不同
【发布时间】:2019-10-24 03:16:36
【问题描述】:

这是最离奇的事情。

我正在尝试使用 C# HttpClient 下载此文件: https://statics.teams.microsoft.com/evergreen-assets/skype/v2/smile/50.png

它恰好是 Microsoft Teams 表情图像文件之一。

(顺便说一句,我必须使用 Chrome 将这张图片本地下载到我的机器上,然后从那里上传,因为 StackOverflow 图片上传也无法处理 URL……)

我已经尝试了许多不同的破解代码来下载这个文件 - 最直接和最常用的方法是:

var client = new HttpClient();
var webStream = await client.GetStreamAsync("https://statics.teams.microsoft.com/evergreen-assets/skype/v2/smile/50.png");
using (var fileStream = new FileStream("smilely.png", FileMode.OpenOrCreate)) {
    webStream.CopyTo(fileStream);
}

我尝试了几种使用 HttpClient、System.Net.WebClient 和原始 WebRequest 的不同方法,结果相同。

如果我将 URL 放入浏览器并转到它,我会按预期看到图像,但如果我从 C# 下载文件,我会得到一个无法打开的损坏图像。

使用浏览器下载的正确文件为 2127 字节,从正确的 PNG 标头字节开始,如下所示:

89 50 4E 47 0D 0A 1A 0A

我以编程方式下载的文件搞砸了,具有完全不同的字节流,只有 2093 个字节,并且开始:

1F 8B 08 00 00 00 00 00

我从同一个集合中下载其他表情图像没有这个问题,例如https://statics.teams.microsoft.com/evergreen-assets/skype/v2/laugh/50.png

这到底是怎么回事?

【问题讨论】:

标签: c# microsoft-teams


【解决方案1】:

1F 8B 是 GZIP 的 magic number

如果我们查看响应内容标题:

var client = new HttpClient();
var response = await client.GetAsync("https://statics.teams.microsoft.com/evergreen-assets/skype/v2/smile/50.png");
var contentHeaders = response.Content.Headers;

我们可以看到ContentEncodinggzip

所以看起来服务器配置出了点问题。通常,如果您明确声明您接受带有 Accept-Encoding 标头的编码响应,服务器只会为您提供内容编码的内容,但看起来这个特定的服务器没有按照此文件的规则播放。

您的浏览器确实表示它接受了 gzip 编码的文件,因此当它收到 gzip 编码的响应时不会闪烁。你的 C# 代码没想到会这样。

你可以通过HttpClient自动解压gzip编码的内容:

var handler = new HttpClientHandler()
{
    AutomaticDecompression = System.Net.DecompressionMethods.GZip
};
var client = new HttpClient(handler);

【讨论】:

  • 非常感谢,我一整天都在为此苦恼。
  • @Eric 没问题!对于这样的问题,很值得知道幻数是一回事。 file 实用程序也非常适合尝试猜测文件的格式 - 它立即表明这是 gzip。
  • @Eric 但是,如果您得到完整的响应并在其属性中四处寻找,您可能会发现gzip 弹出窗口,这将是一个线索。调试的秘诀之一就是不断尝试!
猜你喜欢
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-16
  • 1970-01-01
  • 1970-01-01
  • 2012-07-04
相关资源
最近更新 更多