Ошибка System.Drawing: можно или нельзя использовать в приложении ASP.Net

Мы используем System.Drawing и приложение для управления изображениями в веб-приложении (поворот, отражение и т. Д.). В течение последнего месяца мы периодически получали следующую ошибку.

«Попытка чтения или записи в защищенную память. Часто это указывает на повреждение другой памяти».

На основе библиотеки MSDN кажется, что нам не следует использовать System.Drawing в нашем веб-приложении (см. Вставку ниже).

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

Это просто не кажется правильным, поскольку на ASP.Net есть целый форум для использования System.Drawing в приложениях ASP.Net. Кроме того, все элементы управления веб-редактора изображений, которые я обнаружил, используют Sytem.Drawing, так что это еще одна причина, по которой я думаю, что это не проблема с System.Drawing. Итак, у меня есть следующие вопросы:

1) Есть ли у кого-нибудь еще эта проблема при использовании System.Drawing в приложении ASP.Net? Если да, то каково было исправление.

2) Строка, которая вызывает ошибку, находится ниже, может быть проблема в том, что мы используем MemoryStream, а не в System.Drawing? Решит ли проблему использование потока другого типа.

using (System.Drawing.Image oFullImg = System.Drawing.Image.FromStream(msImage))

3) Если действительно существует проблема и нам не следует использовать System.Drawing, какие еще есть альтернативы для управления изображениями на веб-сайте.

Это становится все более серьезной проблемой по мере того, как она затягивается, поэтому чем быстрее я найду решение, тем лучше. Любая помощь будет оценена по достоинству.


person smehaffie    schedule 10.07.2009    source источник
comment
Помню, однажды я им пользовался, и это сработало. Хотя я не очень хорошо помню детали кода.   -  person Adrian Godong    schedule 10.07.2009


Ответы (3)


Что ж, предупреждение, которое вы описываете, находится в документации MSDN для пространства имен System.Drawing.Imaging, оно не является более официальным, чем это.

Ознакомьтесь с этой статьей Скотта Хансельмана, чтобы увидеть, может ли она пролить свет и взгляните на проект ASP.NET Generated Image на codeplex.

Самое главное, смотрите на комментарии пользователей, когда они обсуждают вашу проблему.

Суть в том, что вроде работает, но не поддерживается Microsoft.

person jvanderh    schedule 10.07.2009
comment
Уже проверяли проект изображения ASP.Net Generated на codeplex. Ирония заключается в том, что он также использует библиотеку System.Drawing в фоновом режиме. Таким образом, эта и другие проблемы, связанные с использованием System.Drawing, вероятно, также возникнут при использовании этой библиотеки. - person smehaffie; 23.07.2009
comment
Я немного поиграл с ним несколько месяцев назад. Однако я использую System.Drawing.Imaging для создания диаграмм на нашем сайте и никогда не сталкивался с какими-либо проблемами. Я предполагаю, что есть причина, по которой он не поддерживается, возможно, они не могли понять, где была проблема, и это было их решением. - person jvanderh; 23.07.2009
comment
Я почти уверен, что он не поддерживается, потому что большинство разработчиков не знают, как обращаться с неуправляемой памятью, а .NET не GC System.Drawing даже близко к правильному. Вы можете использовать его безопасно и в условиях высокой нагрузки, если вы правильно кодируете. - person Lilith River; 24.10.2011

Мы широко используем пространство имен System.Drawing в нескольких приложениях ASP.NET, и мы также получаем эту ошибку. Это совершенно непоследовательно, и я пришел к выводу, что это больше связано с обстоятельствами (использование системных ресурсов, количество одновременных запросов и т. Д.), Чем с чем-либо еще. Я не могу предложить вам решение, которое гарантировало бы, что этого не произойдет, кроме перехода к SOA-ориентированному решению, в котором обработка изображений осуществляется за пределами домена сайта ASP.NET, но я скажу, что вы можете минимизируйте эти случаи, будучи абсолютно без сомнения уверенным, что вы удаляете какой-либо объект в пространствах имен System.Drawing и System.Drawing.Imaging, которые реализуют IDisposable. Похоже, вы уже делаете это с использованием шаблона, но есть странные объекты (например, System.Drawing.Imaging.EncoderParameters), которые необходимо удалить вместе с обычными подозреваемыми.

Помимо этого, вы можете делать и другие вещи, например настраивать сайт в собственном пуле приложений IIS и настраивать пул на регулярную переработку, что может помочь.

Однако я буду следить за этим вопросом, так как мне бы хотелось увидеть 100% решение этой проблемы.

person AJ.    schedule 10.07.2009

Я предполагаю, что исключение AccessViolationException вызвано поврежденным изображением. Поврежденное изображение может обмануть GDI, чтобы он попытался прочитать после конца потока.

Я бы посоветовал записывать изображения, на которых это происходит, а затем анализировать изображения, чтобы убедиться, что они воспроизводятся.

Вы выполняете квантование изображений или используете LockBits и получаете прямой доступ к данным?

person Lilith River    schedule 24.10.2011