以下是真正需要工作的所有代码。我有理由相信这个问题只与discogs有关。如果它是discogs,我想知道一种解决方法,例如模拟浏览器。
使用下面的代码,它应该连接到页面然后下载图像,但是当我运行它时会得到503错误。如果我使用相同的链接连接到该页面,它将在我的浏览器中显示该图像。
WebClient client = new WebClient();
client.DownloadFile("https://img.discogs.com/h7oMsgLSWi7D6nBR8wdBwWulJ8w=/fit-in/600x600/filters:strip_icc():format(jpeg):mode_rgb():quality(90)/discogs-images/R-9259029-1477514675-9740.jpeg.jpg", @"C:\Programming\Test\downloadimage.jpg");
但是,如果我使用Imgur,并使用该程序执行此操作,则会按预期下载图像。
client.DownloadFile("http://i.imgur.com/sFq0wAC.jpg", @"C:\Programming\Test\downloadimage.jpg");
我能够使用客户端连接到discogs,甚至可以通过它搜索并使用client.DownloadString(“url”);
将结果作为文本(尽管通过html)获取但我无法下载任何图片。我很感激任何帮助,我想要的只是图像。
答案 0 :(得分:4)
您可以在标头中添加用户代理,假装它是来自浏览器的请求。
WebClient client = new WebClient();
client.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
client.DownloadFile("https://img.discogs.com/h7oMsgLSWi7D6nBR8wdBwWulJ8w=/fit-in/600x600/filters:strip_icc():format(jpeg):mode_rgb():quality(90)/discogs-images/R-9259029-1477514675-9740.jpeg.jpg", @"C:\Programming\Test\downloadimage.jpg");
答案 1 :(得分:1)
我有理由相信这个问题只与discogs有关。
在我看来,你应该有。当服务器正确返回503服务不可用结果时,没有理由相信问题就在您身边,并且不会抛出任何异常。
为什么会这样?只有开发人员才有可能知道
我的建议是,由于某些Accept
,User Agent
或其他客户端属性,此服务会尝试避免过多的非用户生成的流量并返回此响应而不是您的图像。这就是为什么它只在您使用WebClient下载时才会发生。尝试修改某些内容并伪装成用户,而不是应用程序。
如果您通过代理工作,您可能还想通过直接连接进行检查。
答案 2 :(得分:0)
添加一些标头信息(接受或用户代理)的解决方案对我不起作用。
但是,如果我将HttpClient与静态实例一起使用,则可以正常工作!
private static HttpClient _httpClient = new HttpClient();
public static async Task<Stream> LoadImageFromUrl(string url)
{
Stream stream = null;
try
{
HttpResponseMessage result = await _httpClient.GetAsync(url);
stream = await result.Content.ReadAsStreamAsync();
}
catch (Exception e)
{
// TODO
}
return stream;
}
答案 3 :(得分:0)
尽管https://stackoverflow.com/users/1966464/germansniper的解决方案对我来说并不完全正确,但它为我指明了正确的方向。将来我给别人的版本...
using (HttpClient http = new HttpClient { BaseAddress = new Uri(url) }) {
http.DefaultRequestHeaders.Accept.Clear();
http.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/image"));
HttpResponseMessage result = http.GetAsync(url).Result;
if (result.IsSuccessStatusCode) {
Stream stream = result.Content.ReadAsStreamAsync().Result;
return Image.FromStream(stream);
}
}