1

我们让 ImageResizer 抛出如下所示的错误,随后我相信应用程序池崩溃并启动了一个新的应用程序池……这反过来又导致大量图像队列堆积,服务中断半小时。有人见过这个吗?

请注意,对于文件名中带有“images”的图像,我们还在 EventLog 中的 ImageResizer 中看到了一些“拒绝访问”错误。不确定是否相关。

任何想法将不胜感激

异常信息:异常类型:ImageProcessingException 异常消息:未能在 15000 毫秒内获得对文件“E:\images\1d\3a05214b1dfa98e41d04ed86db6c3f6e600347e92a1b102016e8eac5ee15a9ed.jpg”的锁定。缓存失败。在 ImageResizer.Plugins.DiskCache.DiskCache.Process(IResponseArgs e)
在 ImageResizer.Plugins.DiskCache.DiskCache.Process(HttpContext context, IResponseArgs e) 在 ImageResizer.InterceptModule.HandleRequest(HttpContext context, String virtualPath, NameValueCollection queryString, IVirtualFile vf) 在 ImageResizer.InterceptModule.CheckRequest_PostAuthorizeRequest(Object sender, EventArgs e) 在System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 在 System.Web.HttpApplication.ExecuteStep(IExecutionStep 步骤,布尔值&完成同步)

4

1 回答 1

0

“让它运行提示”

首先,确保您运行的是 ImageResizer 3.4 或更高版本,因为它可以解决 4.0 CLR 中与文件刷新相关的一些新错误。

其次,确保没有防病毒软件可以在运行时扫描或锁定文件(AV 喜欢在文件写入后立即扫描文件,锁定它们直到它们“通过”)。

第三,确保没有模拟发生 - 缓存文件由 ASP.NET 编写,但由 IIS 提供服务,因此可以涉及多个用户帐户。

第四,确保您的服务器磁盘启用异步写入。这极大地减少了文件句柄争用。您还可以在 ImageResizer 的 DiskCache 中启用 asyncWrites 来提供帮助。

诊断罪魁祸首

如果这发生在一组特定的文件上(并且损坏的图像不会很快“修复”自己),那么您可能已经永久锁定了文件,以免工作进程意外死亡。通常,这些文件的唯一解决方案是重新启动服务器,但首先尝试使用 Sysinternals 工具。Sysinternals Process Montior、Process Explorer 和 Handle可用于诊断导致锁定的进程(当然,不是进程中的哪个软件)。

诊断是什么杀死了一个进程并不是很困难,但可能很耗时。打开失败的请求跟踪(如果没有帮助,请使用adplus 获取故障转储)。故障转储可以识别罪魁祸首,但失败的请求跟踪只能给你很好的提示。在我检查过的故障转储中,ImageResizer 几乎从来都不是原因,因为它使用了非常好的内存管理并且倾向于很好地管理错误。如果您有任何其他处理成像的软件,您可能会考虑禁用它们。

由于 ImageResizer 是一项 Web 服务,您通常可以在使用不同应用程序池的子应用程序中运行它。如果您怀疑 ImageResizer 是问题所在,这通常是确定的最快方法。当然,如果您的图像是从多个根目录提供的,这可能需要一些时间,因为您必须创建多个子应用程序。

于 2013-11-07T13:36:46.413 回答