ImageResizer: System.BadImageFormatException вызывает сбой веб-приложения, несмотря на попытку ... поймать - PullRequest
0 голосов
/ 18 июня 2019

Пользователь загрузил файл 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, и это убивает наш веб-пул.

Это не только локально. Это было замечено, потому что мы запускаем это как бета-сайт, и это убивало его.

...