代码之家  ›  专栏  ›  技术社区  ›  İhsan İlicali

在WindowsPhone中从web下载某些图像时出现AG_E_NETWORK_ERROR

  •  3
  • İhsan İlicali  · 技术社区  · 13 年前

    我正在使用HtmlAgilityPack。 我正在从一个网站下载文章和图片。80%的图像下载没有问题。但有些图像抛出错误。我可以在image_failed事件中看到错误的名称。 我正在下载这样的图片:

     Image = new BitmapImage(new Uri(img.Attributes["src"].Value));
    

    我在谷歌上搜索过,发现这真的是WTF的问题。

    1 回复  |  直到 13 年前
        1
  •  3
  •   Shahar Prish    13 年前

    很有可能是推荐人的标题把你搞砸了。您需要自己发出调用(而不是依赖BitmapImage来下载文件)。

    有一个方便的代码片段/实用程序可以“扩展”xaml并使其更容易实现。

    http://blogs.msdn.com/b/swick/archive/2011/08/04/wp7-mango-image-download-with-custom-referer-header.aspx

    编辑:解释

    很多网站都会屏蔽非来自其网站的图片请求。那样的话,如果你有 http://mysite.com 然后链接到中的图像 http://cnn.com ,他们可以阻止直接链接的图像并重定向它们或其他什么。

    现在,它工作的原因是浏览器控制所有从标签(或任何其他机制,如AJAX)进行的调用,并添加REFERRER HTTP头,说明请求来自哪里( http://mysite.com )-然后cnn.com代码可以阻止它。

    在.NET桌面中,Referrer标头不会自动添加到请求中,这意味着该调用将被一些检查空引用的网站阻止,而不是被其他没有空引用的站点阻止。

    切换到基于Silverlight的WP7/8。在Silverlight中,引用者是承载Silverlight控件的网站。所以,如果你有一个SL控件在运行 http://mysite.com 并且它发出[任何]http请求,referrer标头将自动设置为 http://mysite.com 。(出于安全原因)没有办法控制这种情况。然而,Windows Phone虽然基于SL,但不需要受到相同的安全约束。然而,当他们将代码“移植”到Windows Phone时,他们会在referrer中输入一些值——该值实际上是手机内的包位置(你可以通过fiddler看到这一点)。它实际上是某种路径(/apps/storage/[guid])或类似的东西——我记不起确切的值了。要解决这个问题,您可以在发出请求的HTTP标头上设置网站的引用人。

    希望这能说明问题。