Ошибка System.Drawing: Может или не может быть использован в приложении ASP.Net - PullRequest
3 голосов
/ 10 июля 2009

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

"Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена."

Судя по библиотеке 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, какие существуют альтернативы для работы с изображениями на веб-сайте.

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

Ответы [ 3 ]

1 голос
/ 10 июля 2009

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

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

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

1 голос
/ 10 июля 2009

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

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

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

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

0 голосов
/ 24 октября 2011

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

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

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

...