我们让ImageResizer抛出下面显示的错误,随后我相信应用程序池崩溃了,一个新的启动了......反过来,这也导致了大量的图像队列建立起来,服务也减少了一半一小时。有人见过这个吗?
请注意,我们还在EventLog中看到了ImageResizer中的一些“访问被拒绝”错误,其中包含文件名中包含“images”的图像。不确定是否相关。
任何想法都会非常感激
异常信息: 异常类型:ImageProcessingException 异常消息:无法获取文件锁定“E:\ images \ 1d \ 3a05214b1dfa98e41d04ed86db6c3f6e600347e92a1b102016e8eac5ee15a9ed.jpg” 在15000ms之内。缓存失败。在 ImageResizer.Plugins.DiskCache.DiskCache.Process(IResponseArgs e)
在ImageResizer.Plugins.DiskCache.DiskCache.Process(HttpContext 上下文,IResponseArgs e)at ImageResizer.InterceptModule.HandleRequest(HttpContext context,String virtualPath,NameValueCollection queryString,IVirtualFile vf)at ImageResizer.InterceptModule.CheckRequest_PostAuthorizeRequest(对象 发件人,EventArgs e)at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 在System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤, 布尔和放大器; completedSynchronously)
答案 0 :(得分:0)
首先,请确保您正在运行ImageResizer 3.4或更高版本,因为它解决了与文件刷新相关的4.0 CLR中的一些新错误。
其次,确保没有可以在运行时扫描或锁定文件的防病毒软件(AV喜欢在文件写入后立即扫描文件,锁定它们直到它们“通过”)。
第三,确保没有模拟发生 - 缓存文件由ASP.NET编写,但由IIS提供,因此可以涉及多个用户帐户。
第四,确保服务器的磁盘启用异步写入。这极大地减少了文件句柄争用。您还可以在ImageResizer的DiskCache中启用asyncWrites来帮助。
如果发生了一组特定的文件(并且损坏的图像不会很快“修复”),您可能会永久锁定文件,防止工作进程意外死亡。通常,这些文件的唯一解决方案是重新启动服务器,但首先尝试使用Sysinternals工具。 Sysinternals Process Montior, Process Explorer, and Handle可用于诊断导致锁定的进程(当然不是进程中的哪个软件)。
诊断杀死进程的方法并不是非常困难,但可能非常耗时。 Turn on failed request tracing(如果这没有帮助,请使用adplus to get a crash dump)。崩溃转储可以识别罪魁祸首,但失败的请求跟踪只能为您提供良好的提示。在我检查的崩溃转储中,ImageResizer几乎从来都不是原因,因为它使用了非常好的内存管理并且往往很好地管理错误。如果您有任何其他处理成像的软件,您可以考虑禁用它们。
由于ImageResizer是一种Web服务,通常可以在使用不同应用程序池的子应用程序中运行它。如果您怀疑ImageResizer是问题所在,这通常是最快的确定方式。当然,如果您的图像是由多个根级目录提供的,那么这可能需要一些时间,因为您必须创建多个子应用程序。