2013-07-13 5 views
1

Я создал тестовый проект только для случая. У меня есть один элемент управления Image в моих .xaml так:Изображение не загружается в Windows Phone - AG_E_NETWORK_ERROR

<Image x:Name="img" /> 

Я испытанный проект с 6 фотографии, и все они из того же веб-сайта. Размер отображаемых изображений составляет приблизительно 50 - 90 КБ. И изображение, которое не отображается, составляет 294 КБ.

И я устанавливаю источник изображения подобного:

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

Что может быть проблема? Спасибо.

Update1:

Кроме того, я ckecked событие ImageFailed. Он метает AG_E_NETWORK_ERROR исключение.

UPDATE2:

Здесь источник изображения, которое не показывает: (удалено)

+0

Почему бы не попробовать асинхронно загрузки изображения? Вам нужно будет установить библиотеку BCL Async, которая доступна в Nuget. Для этого есть руководство [здесь] (http://blogs.msdn.com/b/swick/archive/2011/04/07/image-tips-for-windows-phone-7.aspx). –

+0

Помните, что предел рендеринга составляет 2000x2000 пикселей. Так что это, вероятно, не ваш файл, это проблема! –

+0

@NateDiamond Спасибо за руководство. Но в этом руководстве используется библиотека BCL Async. –

ответ

3

image in question имеет защиту горячей линии связи на.

Это, скорее всего, преступник, препятствующий вам загрузить его. И, учитывая защиту hotlink, я бы предположил, что у вас нет необходимых прав на ее использование в приложении.

Если вы хотите обойти это, используйте класс HttpWebRequest и установите HttpWebRequest.Referer.

+0

Спасибо за ответ. Но откуда вы узнали, что на изображении есть защита? –

+0

Нажав на ссылку, вы получите код ошибки HTTP 403 - Forbidden. Причина, по которой вы его не видите, заключается в том, что если вы вставляете ссылку в свой браузер, вы пропускаете защиту hotlink. –

+0

Также обновлен ответ с предлагаемым обходным решением. –

3

Благодаря @Claus Jørgensen, я узнал, что некоторые веб-сайты могут использовать защиту от горячих ссылок, чтобы другие веб-сайты не могли напрямую ссылаться на файлы и изображения на вашем веб-сайте. Итак, я создаю AttachedProperty для привязки источника изображения к 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 
} 
Смежные вопросы