Windows Phone中未加载图像-AG_E_NETWORK_ERROR
本文关键字:NETWORK ERROR -AG 图像 Phone 加载 Windows | 更新日期: 2023-09-27 18:22:23
我已经为这个案例创建了一个测试项目。我的.xaml中有一个图像控件:
<Image x:Name="img" />
我用6张图片测试了这个项目,所有的图片都来自同一个网站。显示的图像大小约为50-90KB。没有显示的图像是294KB。
我正在设置这样的图像来源:
img.Source = new BitmapImage(new Uri(imageURI));
什么可能是问题?谢谢
更新1:
此外,我已经取消了ImageFailed事件。它正在抛出AG_E_NETWORK_ERROR异常。
更新2:
以下是未显示的图像来源:(已删除)
有问题的图像启用了热链接保护。
这很可能是阻止你下载它的罪魁祸首。考虑到热链接保护,我想你也没有在应用程序中使用它的必要权利。
如果您希望解决此问题,请使用HttpWebRequest类并设置HttpWebRequest.Referer属性。
感谢@Claus Jørgensen,我了解到一些网站可以使用热链接保护来防止其他网站直接链接到您网站上的文件和图片。因此,我创建了一个AttachedProperty,用于将Image的源绑定到URI,并异步下载。
这是.xaml:
<Image AttachedProperties:ImageProperties.SourceWithCustomReferer="{Binding Image, Mode=TwoWay}"/>
和附加属性:
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
}