【问题标题】:Image caching issue by using files in ASP.NET在 ASP.NET 中使用文件的图像缓存问题
【发布时间】:2012-05-12 01:09:14
【问题描述】:

我在使用 ASP.NET 中的文件时遇到了图像缓存问题。我的详细解决方案是:

  • 对于第一个请求:我检查图像文件不存在并将图像文件写入硬盘。之后将文件的url返回给浏览器

  • 对于后面的请求:该函数只是将文件的url返回给浏览器

我的问题是:有时第一次请求时,浏览器无法从 url 获取图像数据并导致 404 - File Not Found 错误。我认为这可能是因为文件已写入但尚未准备好从浏览器中检索,但在代码中我对位图和图形对象同时使用“using 语句”和“Dispose 方法”,以确保一切都准备好从浏览器访问。

更详细地说,我使用的是与 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()函数)

【问题讨论】:

  • "将文件的 url 返回给浏览器" - 是 302 重定向吗?或者您的“第一个请求”是指对其他页面的请求,而不是对图像的请求?
  • 您没有发布足够的代码来诊断为什么第一个请求返回的 URL 没有准备好图像。您要询问的错误在您剪掉的代码中。也就是说,正如@Aristos 的回答中提到的那样,您在这里有一个主要的线程错误。
  • 嗨,克里斯,我在问题中添加了指向完整源代码的链接。有时间请查看。提前致谢。

标签: c# asp.net http-status-code-404


【解决方案1】:

这是我看到的一个例子,当多个请求同时发生在同一个图像上时。

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

所以我的建议是用mutex 更改 lock 并使用图像名称或图像代码作为互斥锁的名称,以不锁定任何东西和任何图像这将被制作,但只有一个由互斥锁上的名称定义的。所以用互斥锁换锁,然后看看这个问题是否还存在。

一个提示:互斥锁名称对大小和字符有一些限制。如果您使用图像文件名作为互斥锁的名称,请确保它被互斥锁接受。

【讨论】:

  • 是的 - 如果这段代码曾经看到高负载和一个空的图像缓存,它会迅速通过线程池,每个线程都卡在这个锁中,等待每个线程完成图像写入操作。您需要一个互斥锁,但您可能还需要客户端的异步和服务器上的工作队列,而不是锁定 ASP.Net 请求线程。
【解决方案2】:

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

如果已修复 - 使用 @Aristos 建议将锁定(监视器)替换为命名的 Mutext 以将锁定范围锁定到单个文件(如果您的网站预计负载很重)。

【讨论】:

    猜你喜欢
    • 2010-11-07
    • 2013-05-26
    • 2010-12-14
    • 2011-04-19
    • 2011-09-22
    • 2011-02-28
    • 2011-01-11
    • 2019-12-02
    • 2015-12-18
    相关资源
    最近更新 更多