使用C#HttpClient下载的Skype表情符号与使用浏览器下载的不同

使用C#HttpClient下载的Skype表情符号与使用浏览器下载的不同,c#,microsoft-teams,C#,Microsoft Teams,这是最奇怪的事情 我正在尝试使用C#HttpClient下载此文件: 它恰好是微软团队的一个表情图像文件 (顺便说一句,我不得不用Chrome将这个图像本地下载到我的机器上,然后从那里上传,因为StackOverflow图像上传也无法处理URL…) 我在下载此文件的代码中尝试了许多不同的破解方法-最简单、最常用的方法是: var client = new HttpClient(); var webStream = await client.GetStreamAsync("https://st

这是最奇怪的事情

我正在尝试使用C#HttpClient下载此文件:

它恰好是微软团队的一个表情图像文件

(顺便说一句,我不得不用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,以及原始WebRequests,结果都是一样的

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

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

89 50 4E 47 0D 0A 1A 0A
我以编程方式下载的文件出错了,有一个完全不同的字节流,只有2093字节,并且开始:

1F 8B 08 00 00 00 00 00
我从同一组中下载其他表情图片时没有这个问题,比如

这到底是怎么回事?

1F 8B
是GZIP的首选

如果我们使用以下内容查看响应内容标题:

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;
我们可以看到
ContentEncoding
gzip

看来服务器配置出了问题。通常,如果您明确声明接受带有
accept encoding
头的编码响应,服务器只会给您一些内容编码的内容,但是看起来这个特定的服务器没有按照此文件的规则运行

您的浏览器确实说它接受了gzip编码的文件,所以在收到gzip编码的响应时不会闪烁。你的C#代码没想到会这样

您可以获取
HttpClient
以自动解压缩gzip编码的内容,方法是:

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

1F 8B
是GZIP的首选。非常感谢,我一整天都在为这件事绞尽脑汁。@Eric没问题!很值得一提的是,对于这样的问题,幻数是一种东西。
文件
实用程序在尝试猜测文件的格式方面也很出色-它认为这是gzip。@Eric但是,如果你得到了完整的响应并仔细查看了它的属性,你可能已经发现了弹出的
gzip
,这可能是一个线索。调试的秘诀之一就是不断尝试!