Как я могу удалить загруженный файл из запроса страницы ASP.NET и обработать запрос, не ставя под угрозу его целостность?
Предположим, кто-то:
- посещения и страница ASPX (http get request).
- устанавливает "слишком большой" файл в загрузчике файлов и нажимает кнопку загрузки (http post request).
Я не хочу, чтобы пользовательская страница с ошибками была обслужена; это глупо и разрушает приложение.
Я хочу обработать ошибку программно. Он может быть перехвачен (я думаю, что после того, как весь запрос будет получен) обработчиком Application_BeginRequest файла global.asax, как показано здесь.
То, что я хотел бы сделать, это удалить файл негабаритных из запроса, установить какой-то флаг в что-то вроде "HttpContext.Current.Items["filetoolarge"] = true", а затем выполнить Server.Transfer на той же странице, так что запрос выполняется так, как если бы файл никогда не отправлялся, за исключением того, что теперь есть этот флаг ошибки, который, конечно, будет проверять страницу и отображать хорошее сообщение об ошибке при обнаружении.
Можно ли это сделать?
3 ответа
Я разместил решение здесь: где я могу поймать и обработать превышение maxAllowedContentLength в IIS7?
Мое решение заключается в переопределении обработчика страницы OnError, и я думаю, что он работает только в.NET 4.0, потому что он включает получение последнего исключения в виде HttpException и проверку свойства WebEventCode, которое, по-видимому, является новым в среде.NET 4.0.
Там есть другое решение, которое включает перехват глобального обработчика приложения Application_EndRequest, где доступны значения свойств StatusCode и SubStatusCode, но я не думаю, что это работает, потому что ответ, вероятно, уже был сброшен клиенту к тому времени, когда EndRequest событие поднято.
По моему опыту, методы OnError и Application_EndRequest запускаются практически сразу, задолго до того, как сервер мог получить весь запрос, поэтому он, вероятно, запускается в результате некоторого раннего предупреждения о размере запроса.
Я протестировал метод OnError, и он работает безупречно, за исключением неизбежной задержки, когда браузер настаивает на завершении загрузки своего запроса перед обработкой и отображением ответа сервера.
Информацию о кодах веб-событий можно найти здесь - http://msdn.microsoft.com/en-us/library/ff650306.aspx
Единственный способ, которым я знаю, как сделать это без использования Flash или ActiveX, это установить для maxRequestLength высокое значение, а затем использовать JavaScript для доступа к информации о файле, как только он станет доступным, а затем обработать отмену / обработку ошибок. Для этого я использовал элемент управления загрузкой Telerik, но у вас должно получиться нечто подобное.
Задавать maxRequestLength
в вашем web.config большое значение, как это:
<system.web>
<httpRuntime maxRequestLength="26000" executionTimeout="600"/>
</system.web>
так что вы можете получить большой файл. и затем обработайте это так:
If fileUploader.PostedFile.ContentLength > theSize Then
'show error'
else
'process it'
End If
Надеюсь, поможет.
ОБНОВИТЬ:
maxRequestLength
находится в кб.
PostedFile.ContentLength
в байтах.