WPF - 通过URL加载图像时出现异常

时间:2014-04-16 09:02:10

标签: c# .net wpf image bitmap

我在将图像按URL下载到BitmapImage时遇到问题。

在某些工作站上,这不起作用。我不知道为什么......

例如,在我自己的工作站上,这很好用。相同的OS,相同的网络。

嗯..我有一些代码可以从网络服务器加载一些图像并将它们显示在ListView中。

此代码部分处理下载:

Application.Current.Dispatcher.Invoke((Action)(delegate
                   {
                       try
                       {
                           DTOBild dtoBild = new DTOBild();
                           BitmapImage small_image_bmp = new BitmapImage(new Uri( "http://our-own-server/images/99999999/" + bild));


                           dtoBild.bitmap = small_image_bmp;

                           this.listeBilder.Add(dtoBild);
                       }
                       catch (Exception ex)
                       {
                           log.schreibeFehler("Error at loading image. Stack is following ...");
                           log.schreibeFehler(ex.Message);
                           log.schreibeFehler(ex.StackTrace);

                       }
                   }));

它崩溃了这一行:

      BitmapImage small_image_bmp = new BitmapImage(new Uri( "http://our-own-server/images/99999999/" + bild));

这是一个例外:

  

Ausnahme von HRESULT:0x80072EE4     bei System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode,IntPtr errorInfo)      bei System.Runtime.InteropServices.Marshal.ThrowExceptionForHR(Int32 errorCode)      bei MS.Win32.WinInet.get_InternetCacheFolder()      bei System.Windows.Media.Imaging.BitmapDownload.BeginDownload(BitmapDecoder decoder,Uri uri,RequestCachePolicy uriCachePolicy,Stream stream)      bei System.Windows.Media.Imaging.LateBoundBitmapDecoder..ctor(Uri baseUri,Uri uri,Stream stream,BitmapCreateOptions createOptions,BitmapCacheOption cacheOption,RequestCachePolicy requestCachePolicy)      bei System.Windows.Media.Imaging.BitmapDecoder.CreateFromUriOrStream(Uri baseUri,Uri uri,Stream stream,BitmapCreateOptions createOptions,BitmapCacheOption cacheOption,RequestCachePolicy uriCachePolicy,Boolean insertInDecoderCache)      bei System.Windows.Media.Imaging.BitmapImage.FinalizeCreation()      bei System.Windows.Media.Imaging.BitmapImage.EndInit()

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

从堆栈跟踪中可以看到,问题似乎是由于尝试访问系统下载的图像缓存而引起的。您可以尝试在加载图像时绕过缓存,方法是设置BitmapCreateOptions.IgnoreImageCache标志:

var small_image_bmp = new BitmapImage();
small_image_bmp.BeginInit();
small_image_bmp.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
small_image_bmp.UriSource = new Uri("http://our-own-server/images/99999999/" + bild);
small_image_bmp.EndInit();

但这只是猜测。

答案 1 :(得分:0)

TL; DR:检查注册表项HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders并修复任何不存在/不可访问/无效的路径 - 然后再注销然后再打开。

我也遇到了这个问题。首先,0x2ee4 = 12004 = ERROR_INTERNET_INTERNAL_ERROR,所以HRESULT 0x80072EE4 = HRESULT_FROM_WIN32(ERROR_INTERNET_INTERNAL_ERROR)

现在这并没有告诉你太多,所以我不得不一直跟踪wininet.dll来解决它。在我的情况下,错误结果来自WININET!CCacheClientCounters::Initialize,实际上是由我的Cache和Cookies shell文件夹以某种方式设置为无效值。您可以在注册表项HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders中找到shell文件夹设置。请注意,您必须至少注销并再次使更改生效。

这就是为我修复它的原因,但由于这个错误可能意味着任何可能出错的事情,这可能不是你的问题。我在Wininet.dll中做了很多初始化的缓存内容,而且唯一的日志记录是一些ETW跟踪,看起来似乎是指原始源中的亚麻,所以它在调试中确实无济于事它适用于微软以外的任何人。