Странная ошибка генерации изображения в asp.net - PullRequest
5 голосов
/ 09 марта 2012

У меня есть проект ASP.NET-MVC, где мне нужно динамически генерировать некоторые PNG-изображения. Это легко. Я просто создаю ActionResult, который возвращает объект FileSreamResult. Для создания изображений я использовал классы из System.Drawing, такие как Bitmap и Image. Все отлично работает на локальной машине и на производственном сервере. Но когда IIS на рабочем сервере отключает мой пул приложений из-за неактивности и запускает его снова, генерация образа начинает давать сбой.

Проблема в коде, который пытается сохранить изображение в поток:

  var imageStream = new MemoryStream();
  bmp.Save(imageStream, ImageFormat.Png);

Исключение составляет: System.Runtime.InteropServices.ExternalException (0x80004005): в GDI + произошла общая ошибка. Так что тут особой помощи нет. Я пробовал разные решения и ничего не помогает. После того, как я нашел эту тему Альтернативы System.Drawing для использования с ASP.NET?

Основная идея этой темы:

Классы в пространстве имен System.Drawing не поддерживаются для использования в службе Windows или ASP.NET. Попытка использовать эти классы из одного из этих типов приложений может привести к непредвиденным проблемам, таким как снижение производительности службы и исключения во время выполнения.

Поэтому я решил использовать классы WPF для генерации изображений. Я переписал весь код генерации изображений, но теперь я получаю еще одну ошибку после перезапуска пула приложений. Исключение: System.Runtime.InteropServices.COMException (0x88982F8A): Исключение из HRESULT: 0x88982F8A . Это происходит, когда я пытаюсь сохранить свой PngBitmapEncoder в поток

var stream = new MemoryStream();
encoder.Save(stream);

Может, кто-нибудь сталкивался с этой проблемой или просто есть идеи?

Ответы [ 2 ]

1 голос
/ 12 марта 2013

Вот неудовлетворительный ответ ...

Я получал ту же ошибку при первом развертывании новой функции создания образов.

Я остановил соответствующий пул приложений, перезапустил его снова, и он заработал.

0 голосов
/ 09 марта 2012

Я не могу ответить на ваш вопрос как таковой, но если это происходит только потому, что ваше приложение закрывается, почему бы не установить его Idle равным 0 (пул приложений -> Приложение -> Дополнительные параметры), тогда оно не выключится.

Это может быть последнее средство, если вы не можете получить подходящий ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...