主题
有一个方法
public static async Task<string> DownloadFile(string url, string path)
{
byte[] data;
using (var client = new HttpClient())
using (HttpResponseMessage response = await client.GetAsync(url))
using (HttpContent content = response.Content)
{
data = await content.ReadAsByteArrayAsync();
using (FileStream file = System.IO.File.Create(path))
file.Write(data, 0, data.Length);
}
return "OK";
}
尝试从 digikey.com 下载图像时,该方法会挂起。
图片链接示例
https://media.digikey.com/Renders/Analog%20Devices%20Renders/8-SOIC.jpg
如果我上传这张图片,那么一切都很好。
https://i.imgur.com/I5Tl0Q2.jpg
如果我通过 Postman 发送一个简单的 GET 请求,我会在响应中得到一张图片。
我知道网站不喜欢请求中的某些内容,但是如何理解呢?
如何调试代码和下载图像?
UDP
这是邮递员发送的curl
curl -X GET \
https://media.digikey.com/Renders/Analog%20Devices%20Renders/8-SOIC.jpg \
-H 'cache-control: no-cache' \
-H 'content-type: application/x-www-form-urlencoded' \
-H 'postman-token: 6580b7fd-5491-20a5-67a0-63119102a341'
using (var httpClient = new HttpClient())
{
using (var request = new HttpRequestMessage(new HttpMethod("GET"), "https://i.imgur.com/I5Tl0Q2.jpg"))
{
request.Headers.TryAddWithoutValidation("cache-control", "no-cache");
request.Headers.TryAddWithoutValidation("postman-token", "790e386d-6446-c17c-947a-fb0ac2852685");
var response = await httpClient.SendAsync(request);
}
}
我得到了完全相同的故事。下载挂起。它从imgur正常加载。
我的方法没有挂起,服务器返回错误。
首先,服务器不接受来自俄罗斯 IP 地址的请求。通过代理作品,一切都被下载。但是你可能没有射频,所以它应该像那样工作。
Accept第二:如果没有指定必要的标头,服务器根本不会发送响应(请求挂起到超时) ,即Accept-Encoding.这就是它的工作原理。
就我而言,我必须使用代理,如下所示:
也就是说,下载的所有问题都仅存在于使用此特定服务器的特殊性中。