Платформа.NET « Перехват «Maximum request length exceeded» в ASP.NET приложении

При попытке загрузки большого файла на сервер (использую стандартный FileUpload control)

IIS6 выдает такую ошибку:
Exception Details: System.Web.HttpException: Maximum request length exceeded.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

IIS7 такую:
Ошибка HTTP 404.13 - Not Found
Модуль фильтрации запросов сконфигурирован для блокировки запросов, длина содержимого которых превосходит установленный предел.

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

Найденные в сети решения не работают (видимо подходят только для IIS5):
- Подсчет размера Request в Global.asax/Application_BeginRequest
- Перехват ошибки в Global.asax/Application_Error
Request попросту не доходит до приложения.

Кроме того, нашел коммерческую реализацию компонентов загрузки файлов
- Загрузчик на Flash (заказчика не устраивает)
- Handler для IIS (нет бесплатной версии, потому заказчика тоже не устраивает)

Каким образом можно сделать такой Handler? Как из Request выделить тело файла?
Как посчитать его размер? Как передать данные дальше в приложение?
Может кто то сталкивался с подобной проблемой и нашел решение?
Если нет решения - наводящие ссылки тоже приветствуются!

1 ответов


Вроде бы нашел подходящее решение ...
FileUpload нужно положить в IFrame, в случае ошибки получаем из IFrame текст этой ошибки.
Реализацию подсмотрел в свежих исходниках Ajax Control Toolkit :)
До конца разберусь - добавлю подробное описание


Во-первых, если длина запроса превышает определенную величину (указывается в web.config, элемент , аттрибут maxRequestLength), то обработка прерывается с исключением System.Web.HttpException. Единственное, что тут можно сделать, это перехватить исключение в Global.asax и перенаправить пользователя на страницу с подходящим сообщением.
Во-вторых, для получения файлов из запроса используется поле Files объекта System.Web.HttpRequest.