我编写了一些代码来从我的 Blogger 博客中导入内容。下载完所有 HTML 内容后,我会浏览图像标签并下载相应的图像。在很多情况下,System.Drawing.Bitmap.FromStream 会引发 ArgumentException。我正在下载的 URL 看起来不错,它提供了预期的图像(这是其中一个问题图像的 URL:http: //4.bp.blogspot.com/_tSWCyhtOc38/SgIPcctWRZI/AAAAAAAAAGg/2LLnVPxsogI/s1600- h/IMG_3590.jpg )。
private static System.Drawing.Image DownloadImage(string source)
{
System.Drawing.Image image = null;
// used to fetch content
var client = new HttpClient();
// used to store image data
var memoryStream = new MemoryStream();
try
{
// fetch the image
var imageStream = client.GetStreamAsync(source).Result;
// instantiate a system.drawing.image from the data
image = System.Drawing.Bitmap.FromStream(imageStream, false, false);
// save the image data to a memory stream
image.Save(memoryStream, image.RawFormat);
}
catch (IOException exception)
{
Debug.WriteLine("{0} {1}", exception.Message, source);
}
catch (ArgumentException exception)
{
// sometimes, an image will link to a web page, resulting in this exception
Debug.WriteLine("{0} {1}", exception.Message, source);
}
catch (AggregateException exception)
{
// sometimes, an image src will throw a 404
Debug.WriteLine("{0} {1}", exception.Message, source);
}
finally
{
// clean up our disposable resources
client.Dispose();
memoryStream.Dispose();
}
return image;
}
知道为什么在这里抛出 ArgumentException 吗?
编辑:我想到这可能是一个代理问题,所以我在我的 web.config 中添加了以下内容:
<system.net>
<defaultProxy enabled="true" useDefaultCredentials="true">
<proxy usesystemdefault="True" />
</defaultProxy>
</system.net>
但是,添加该部分并没有任何区别。
编辑:此代码是从 EF 数据库初始化程序的上下文中调用的。这是一个堆栈跟踪:
Web.dll!Web.Models.Initializer.DownloadImage(string source) 第 234 行 C# Web.dll!Web.Models.Initializer.DownloadImagesForPost.AnonymousMethod__5(HtmlAgilityPack.HtmlNode tag) 第 126 行 + 0x8 字节 C# [外部代码] Web.dll !Web.Models.Initializer.DownloadImagesForPost(Web.Models.Post post) 第 119 行 + 0x34 字节 C# Web.dll!Web.Models.Initializer.Seed(Web.Models.FarmersMarketContext context) 第 320 行 + 0xb 字节 C# [外部代码] App_Web_l2h4tcej.dll!ASP._Page_Views_Home_Index_cshtml.Execute() 第 28 行 + 0x15 字节 C# [外部代码]