图像未在Windows Phone中加载 - AG_E_NETWORK_ERROR

时间:2013-07-13 19:30:39

标签: c# silverlight windows-phone-7

我已经为这个案例创建了一个测试项目。我的.xaml中有一个Image控件:

<Image x:Name="img" />

我用6张照片测试了这个项目,所有这些都来自同一个网站。显示的图像大小约为50-90 KB。并且未显示的图像是294 KB。

我正在设置图像的来源:

img.Source = new BitmapImage(new Uri(imageURI));

可能有什么问题? 感谢。

UPDATE1:

另外,我已经ckecked ImageFailed事件。它正在抛出 AG_E_NETWORK_ERROR 例外。

UPDATE2:

以下是未显示的图像来源: (删除)

2 个答案:

答案 0 :(得分:3)

image in question已启用热链接保护。

这很可能是妨碍您下载它的罪魁祸首。鉴于热链接保护,我猜你没有在应用程序中使用它的必要权利。

如果您希望解决此问题,请使用HttpWebRequest类并设置HttpWebRequest.Referer属性。

答案 1 :(得分:3)

感谢@Claus Jørgensen,我了解到一些网站可以使用热链接保护来阻止其他网站直接链接到您网站上的文件和图片。 所以我创建了一个AttachedProperty来将Image的源绑定到URI并以异步方式下载它。

这是.xaml:

<Image AttachedProperties:ImageProperties.SourceWithCustomReferer="{Binding Image, Mode=TwoWay}"/>

和AttachedProperty:

public static class ImageProperties
{
    #region SourceWithCustomReferer Property
    public static Dictionary<Uri, BitmapImage> imageCache = new Dictionary<Uri, BitmapImage>();

    public static readonly DependencyProperty SourceWithCustomRefererProperty =
        DependencyProperty.RegisterAttached(
            "SourceWithCustomReferer",
            typeof(Uri),
            typeof(ImageProperties),
            new PropertyMetadata(OnSourceWithCustomRefererChanged));

    private static void OnSourceWithCustomRefererChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
    {
        var image = (Image)o;
        var uri = (Uri)e.NewValue;

        if (DesignerProperties.IsInDesignTool)
        {
            // for the design surface we just load the image straight up
            image.Source = new BitmapImage(uri);
        }
        else
        {
            if (imageCache.ContainsKey(uri))
            {
                image.Source = imageCache[uri];
                return;
            }

            image.Source = null;

            HttpWebRequest request = HttpWebRequest.Create(uri) as HttpWebRequest;
            request.Headers["Referer"] = "http://www.WEBSITE.com"; // or your custom referer string here
            request.BeginGetResponse((result) =>
            {
                try
                {
                    Stream imageStream = request.EndGetResponse(result).GetResponseStream();
                    Deployment.Current.Dispatcher.BeginInvoke(() =>
                    {
                        BitmapImage bitmapImage = new BitmapImage();
                        bitmapImage.CreateOptions = BitmapCreateOptions.BackgroundCreation;
                        bitmapImage.SetSource(imageStream);
                        image.Source = bitmapImage;
                        imageCache.Add(uri, bitmapImage);
                    });
                }
                catch (WebException)
                {
                    // add error handling
                }
            } , null);
        }
    }

    public static Uri GetSourceWithCustomReferer(Image image)
    {
        if (image == null)
        {
            throw new ArgumentNullException("Image");
        }
        return (Uri)image.GetValue(SourceWithCustomRefererProperty);
    }

    public static void SetSourceWithCustomReferer(Image image, Uri value)
    {
        if (image == null)
        {
            throw new ArgumentNullException("Image");
        }
        image.SetValue(SourceWithCustomRefererProperty, value);
    }
    #endregion
}