Есть ли ограничения памяти для приложения ASP.Net? - PullRequest
2 голосов
/ 08 февраля 2009

У меня есть приложение ASP.Net MVC, которое позволяет пользователям загружать изображения. Когда я пытаюсь загрузить действительно большой файл (400 МБ), я получаю сообщение об ошибке.

Я предположил, что мой код обработки изображений (домашний кофе) был очень неэффективным, поэтому я решил попробовать стороннюю библиотеку для обработки деталей обработки изображений.

Поскольку я использую TDD, я сначала хотел написать тест, который не прошел. Но когда я тестирую действие контроллера с тем же большим файлом, он может выполнить всю обработку изображения без каких-либо проблем.

Я получаю ошибку «Недостаточно памяти».

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

Другое отличие состоит в том, что я использую SWFUpload, который не используется с тестом. Может ли это быть причиной?

Ответы [ 5 ]

4 голосов
/ 08 февраля 2009

Возможны ограничения памяти в файлах web.config или machine.config, либо в обоих.

В web.config раздел:

<httpRuntime 
executionTimeout="3600" 
maxRequestLength="102400"
/>

В machine.config раздел также может быть разделом httpRunTime, аналогично:

<httpRuntime 
executionTimeout="90" 
maxRequestLength="4096"
useFullyQualifiedRedirectUrl="false" 
minFreeThreads="8" 
minLocalRequestFreeThreads="4"
appRequestQueueLimit="100"
/>

Процесс aspnet также может быть ограничен процентом от общей памяти с помощью раздела processModel, см .:

http://msdn.microsoft.com/en-us/library/7w2sway1.aspx

Я столкнулся с похожими проблемами, которые вы описали в этих настройках.
В частности, атрибут ProcessModel memorylimit.

1 голос
/ 08 февраля 2009

С MSDN :

Одним из способов защиты от атак типа «отказ в обслуживании» является ограничение размера файлов, которые могут быть загружены с помощью элемента управления FileUpload. Вам следует установить ограничение на размер, соответствующее типам файлов, которые вы ожидаете загрузить. Предельный размер по умолчанию составляет 4096 килобайт (КБ) или 4 мегабайта (МБ). Вы можете разрешить загрузку файлов большего размера, установив атрибут maxRequestLength элемента httpRuntime. Чтобы увеличить максимально допустимый размер файла для всего приложения, установите атрибут maxRequestLength в файле Web.config. Чтобы увеличить максимально допустимый размер файла для указанной страницы, установите атрибут maxRequestLength внутри элемента location в Web.config. Например, см. Элемент местоположения (схема настроек ASP.NET).

При загрузке больших файлов пользователь может также получить следующее сообщение об ошибке:

aspnet_wp.exe (PID: 1520) был переработан, поскольку потребление памяти превысило 460 МБ (60 процентов доступной оперативной памяти).

Если ваши пользователи сталкиваются с этим сообщением об ошибке, увеличьте значение атрибута memoryLimit в элементе processModel файла Web.config для приложения. Атрибут memoryLimit указывает максимальный объем памяти, который может использовать рабочий процесс. Если рабочий процесс превышает значение memoryLimit, для его замены создается новый процесс, и все текущие запросы переназначаются новому процессу.

1 голос
/ 08 февраля 2009

На самом деле нет жесткого ограничения для размеров загрузки. Однако, если вы работаете с 32-битным процессом, вы можете быть ограничены объемом памяти, который может обрабатывать ваш рабочий процесс asp.net. Как только он получает около 800 МБ, он становится очень нестабильным.

Параметры тайм-аута, упомянутые Bravax, также являются хорошим местом для проверки.

Поздравляем с использованием TDD!

0 голосов
/ 08 февраля 2009

Необходимо убедиться, что данные из входного потока передаются в файловый поток некоторой формы, чтобы вся сущность запроса не требовалась в памяти.

0 голосов
/ 08 февраля 2009

Откуда именно происходит исключение?

AFAIK В ASP.net/.Net нет предела 400 МБ для размеров изображений. Я пишу проект, где некоторые файлы намного больше. Конечно, может быть и более высокий предел, о котором я не знаю, но это может показаться странным и произвольным.

Вы работаете на 64-битной машине? Может ли ваш файл изображения - без сжатия (это 400 МБ в формате jpg?) - проверить ограничение в 2 ГБ адресного пространства вашего процесса?

...