Пользователь загрузил файл PNG, который выглядит так, как будто он каким-то образом поврежден. Но самая большая проблема заключается в том, что каждый раз, когда наша система пытается сделать миниатюру, происходит сбой и перезагрузка всего пула приложений. Я пробовал использовать прямой URL и использовать код внутри блока try ... catch.
Вот копия изображения: https://drive.google.com/file/d/1GpmnIbia3rtqfKrhpg_nKHpjxdC-AxR3
Если я загружу его в Paint.NET и снова сохраню, он будет работать нормально, поэтому я доволен, что с изображением есть проблема. Но мне нужно, чтобы любые испорченные изображения полностью не повредили мое веб-приложение. Я рад обрабатывать и регистрировать ошибки, но мне нужно, чтобы все продолжалось как обычно.
Например, работая локально в качестве теста, я могу просматривать изображение без проблем. Браузер не возражает:
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]
Я пытался поместить его в свою Задачу в надежде, что это локализует его, но без радости. В любом случае это спорный вопрос. Мы используем исключительно URL-адреса для ImageResizer, и это убивает наш веб-пул.
Это не только локально. Это было замечено, потому что мы запускаем это как бета-сайт, и это убивало его.