在ASP.NET中使用的图像文件缓存的问题(Image caching issue by using

2019-10-16 17:01发布

我在ASP.NET中使用文件面临着图像缓存的问题。 我详细的解决方案是:

  • 对于第一个要求:我检查图像文件不存在,将映像文件写入到硬盘中。 之后,返回文件的网址到浏览器

  • 对于以后的请求:该函数只是返回文件的网址到浏览器

我的问题是:有时与第1请求,浏览器无法从URL中的图像数据,并导致404 - 找不到文件错误。 我想可能是因为该文件的写入,但没有准备好从浏览器获取,但在代码中,我同时使用“使用说明”和“处置方法”的位图和图形对象,以确保一切都准备好从浏览器访问。

在更多的细节,我现在用的是类似的解决方案,如NopCommerce:

lock (s_lock) { ...........
 using (var stream = new MemoryStream(LoadPictureBinary(picture))) {
  using(var b = new Bitmap(stream)){
   using(var newBitMap = new Bitmap(newSize.Width, newSize.Height)){
    .......................
    newBitMap.Save(
        Path.Combine(this.LocalThumbImagePath, localFilename),  ici, ep);
   }
  }
 } 
} // end lock

return url;

更多信息:你可以在检查完整的代码http://nopcommerce.codeplex.com/SourceControl/changeset/view/9125b9a7fafe#src%2fLibraries%2fNop.Services%2fMedia%2fPictureService.cs (请搜索GetPictureUrl()函数)

Answer 1:

这是我看的时候多要求发生一起针对同一图像的情况。

对于这种情况,锁是不够的,你需要使用互斥锁定此过程中的所有线程和所有请求一起。

所以,我的建议是要改变 lock ,用mutex和使用图像的名称,或名称图像的代码互斥不作任何锁定和将要作出,但仅由该定义的任何图像命名互斥。 因此,改变与互斥锁,然后看看这个问题仍然存在。

一个提示:互斥名对大小和人物一定的局限性。 如果您使用的图像文件名作为名称的互斥体确保由互斥接受。



Answer 2:

文件的存在移动检查是相同的下s_lock文件创建。 要解决与部分完成的文件的问题(如果是问题)。

如果是固定的 - 使用@Aristos暗示本名为Mutext更换锁(监视器)来锁定范围到单个文件(如果您的网站预计将有重负载)。



文章来源: Image caching issue by using files in ASP.NET