我正在使用 HtmlAgilityPack。我正在从一个网站下载文章和图片。80% 的图片下载没有问题。但是一些图像抛出错误。我可以在 image_failed 事件中看到错误名称。我正在下载这样的图像:
Image = new BitmapImage(new Uri(img.Attributes["src"].Value));
我搜索了谷歌,发现这确实是 WTF 问题。
我正在使用 HtmlAgilityPack。我正在从一个网站下载文章和图片。80% 的图片下载没有问题。但是一些图像抛出错误。我可以在 image_failed 事件中看到错误名称。我正在下载这样的图像:
Image = new BitmapImage(new Uri(img.Attributes["src"].Value));
我搜索了谷歌,发现这确实是 WTF 问题。
推荐人标题很有可能把你搞砸了。您需要自己发出调用(而不是依赖 BitmapImage 来下载文件)。
有一个方便的片段/实用程序可以“扩展”xaml 并使其更容易执行。
编辑:解释
许多网站阻止对不是来自其网站的图像的请求。这样,如果您有http://mysite.com并且链接到http://cnn.com中的图像,他们可以阻止直接链接的图像并重定向它们或其他东西。
现在,它起作用的原因是浏览器控制从标记(或任何其他机制,如 AJAX)发出的所有调用,并添加 REFERRER HTTP 标头,说明请求来自哪里(http://mysite.com) - 然后 cnn.com 代码可以阻止它。
在 .NET 桌面中,Referrer 标头不会自动添加到请求中 - 这意味着调用将被某些检查空引用者的站点阻止,而不是其他不检查的站点。
切换到基于 Silverlight 的 WP7/8。在 Silverlight 中,引用者是托管 Silverlight 控件的站点。因此,如果您在http://mysite.com上运行了一个 SL 控件并且它发出 [任何] http 请求,那么推荐人标头将自动为您设置为http://mysite.com. 没有办法控制那个 afaik(出于安全原因)。然而,Windows Phone 虽然基于 SL,但不需要受相同的安全约束。但是,当他们将代码“移植”到 Windows Phone 时,他们将一些值放入 referrer 中 - 该值实际上是手机内的包位置(您可以使用 fiddler 看到这一点)。它实际上是一些路径(/apps/storage/[guid])或类似的东西 - 我不记得确切的值。为了解决这个问题,您可以在发出请求的 HTTP 标头上将引荐来源网址设置为站点。
希望这说明清楚。