用户上传了一个PNG文件,该文件看起来好像已以某种方式损坏。但是最大的问题是,每当我们的系统尝试将其缩略图化时,整个应用程序池都会崩溃并重新启动。我已经尝试过使用直接URL并在try ... catch块内使用代码。
这是图片的副本:https://drive.google.com/file/d/1GpmnIbia3rtqfKrhpg_nKHpjxdC-AxR3
如果我将其加载到Paint.NET中并再次保存,它可以正常工作,所以我很满意图像有问题。但是我需要阻止所有损坏的图像完全崩溃我的Web应用程序。我很乐意处理并记录错误,但我需要一切正常进行。
例如,作为测试在本地运行,我可以直接查看图像而不会出现问题。浏览器不在乎:
http://localhost:60148/Content/artwork/2019/06/img_0021-9.png
但是,如果我尝试使用缩略图版本:
http://localhost:60148/Content/artwork/2019/06/img_0021-9.png?w=160&mode=max&otf=y&quality=90&format=jpg&bgcolor=white
Visual Studio将报告以下内容并停止调试:
System.BadImageFormatException: 'An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)'
我有一些旧代码,这些代码也将缩略图写为响应流。即使是尝试捕获,VS在报告错误后仍会停止调试。我具有本地和全局错误处理功能,因此不会发生崩溃。
try
{
ImageBuilder.Current.Build(pathname.StartsWith("/") ? "~" + pathname : pathname, outputStream,
new ResizeSettings(resizeSettings));
}
catch (Exception ex)
{
Console.WriteLine("Could not output to stream: " + ex.Message);
}
在这种方法下,我尝试添加以下属性没有成功:
[HandleProcessCorruptedStateExceptions]
和
[SecurityCritical]
我尝试将其放在自己的Task中,希望它可以本地化它,但不高兴。无论如何,这都是有争议的。我们几乎专门将URL用于ImageResizer,这正在杀死我们的Web池。
不仅在本地。注意到它是因为我们将其作为Beta网站运行,并且正在将其杀死。
答案 0 :(得分:1)
System.BadImageFormatException从未引用图像。这是.dll和.exe文件专用的例外情况,指的是使用错误的位(例如64 vs 32)文件。
这里还有其他事情。 ImageResizer也因杀死应用程序池而闻名。您安装了哪些插件?发布诊断页面(/resizer.debug)将有所帮助。