2010-01-14 2 views
2

У нас есть приложение asp.net 3.5, которое позволяет пользователям создавать множество диаграмм и экспортировать их через pdf. Это отлично подходит для небольших PDF-файлов (менее 100 страниц), но когда мы делаем большие, мы получаем случайные ошибки. некоторые из ошибок, которые мы видели, являются:winnovative pdf - из памяти и других случайных исключений

--System.OutOfMemoryException
не --Could визуализировать строку HTML. Не удалось получить изображение из строки html. Попробуйте установить LoadHtmlConcurrencyLevel = 1 ..
- Ошибка при установке. Недостаточно памяти.
--Timeout ждет завершения преобразования.
--System.OutOfMemoryException: Недостаточно памяти. в System.Drawing.Image.FromStream (поток потока, булева useEmbeddedColorManagement, Boolean validateImageData) в System.Drawing.Image.FromStream (поток Stream)

Если я запускаю большой доклад несколько раз, я обычно получаю различные исключения , Иногда я могу заставить IIS сбой, и мне нужно сделать iisreset, чтобы вернуть приложение.

Вот код, который мы запускаем. Мы создаем документ PDF с диаграммами (png-изображениями), а затем экспортируем его в массив байтов и помещаем его в memystream. Мы передаем поток памяти функции, которая вращает некоторые из изображений и т. Д., А затем вызывает метод doc.save для ее экспорта.

Dim mainPageBytes() As Byte = PDF.GetBytes 
Dim stream As New System.IO.MemoryStream(mainPageBytes) 
Dim existingDoc As New PDFCreator.Document(stream) 
Dim doc As PDFCreator.Document = GetDocument(mainPageBytes, GetChartingPageNumbers(PDF.ConversionSummary), pageOrientation, user, existingDoc) 
doc.Save(response, True, Me.DocumentName) 

ответ

3

У IIS есть ограничения на скрипты, которые выполняются на нем, как для памяти, так и для времени выполнения. Предположительно, ваш скрипт перейдет за пределы среды выполнения и/или памяти. Они могут быть установлены в настройках конфигурации IIS, но они, как правило, существуют по какой-либо причине (чтобы один сценарий не мог съесть всю память на сервере или предотвратить запуск сценария навсегда в бесконечном цикле, который вы бы не имеют выхода из-за перезапуска IIS.)

Включите отладку (которая отключает эти ограничения) и определите, сколько памяти ваши сценарии на самом деле используют при их сбое, выводя queryObj("PeakWorkingSetSize") в файл журнала.

0

Вы запускаете конвертер в 64-разрядном режиме, как рекомендовано в документации по продукту? Вы можете проверить deployment requirements in our online documentation. В 32-битном режиме доступная память для .NET довольно ограничена. В IIS вам нужно убедиться, что флаг 32-разрядных приложений является ложным.

Кроме того, чтобы уменьшить использование памяти при преобразовании HTML-страниц со многими и большими изображениями, вы можете установить для свойства ImagesScalingEnabled значение false. Вы можете найти полный образец кода для этой функции в set images scaling and JPEG compression level demo.

Смежные вопросы