Как я могу удалить загруженный файл из запроса страницы ASP.NET и обработать запрос, не ставя под угрозу его целостность? - PullRequest
1 голос
/ 13 апреля 2011

Предположим, кто-то:

  1. посещения и страница ASPX (http get request).
  2. устанавливает «слишком большой» файл в загрузчике файлов и нажимает кнопку загрузки (http post request).

Мне все равно, чтобы пользовательская страница с ошибками была обслужена; это глупо и разрушает приложение.

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

Что я хотел бы сделать, так это удалить из запроса слишком большой файл, установить какой-нибудь флаг в чем-то вроде "HttpContext.Current.Items [" filetoolarge "] = true", а затем выполнить Server.Transfer для на той же странице, так что запрос выполняется так, как если бы файл никогда не отправлялся, за исключением того, что теперь есть этот флаг ошибки, который, конечно, будет проверять страницу и отображать хорошее сообщение об ошибке при ее обнаружении.

Можно ли это сделать?

Ответы [ 3 ]

0 голосов
/ 13 апреля 2011

Установите 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

Надеюсь, это поможет.

UPDATE:

maxRequestLength в КБ.

PostedFile.ContentLength в байтах.

0 голосов
/ 15 апреля 2011

Я разместил решение здесь: Где я могу перехватить и обработать превышение maxAllowedContentLength в IIS7?

Мое решение заключается в переопределении обработчика страницы OnError, и я думаю, что он работает только в .NET4.0, поскольку включает получение последнего исключения в виде HttpException и проверку свойства WebEventCode, которое, по-видимому, является новым в платформе .NET 4.0.

Существует еще одно решение, включающее перехват глобального обработчика приложения Application_EndRequest,где доступны оба значения свойств StatusCode и SubStatusCode, но я не думаю, что это работает, потому что ответ, вероятно, уже был сброшен клиенту к моменту возникновения события EndRequest.

Из моего опыта,оба метода OnError и Application_EndRequest запускаются практически сразу, задолго до того, как сервер мог получить весь запрос, поэтому он может быть запущен в результате раннего предупреждения о размере запроса.

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

Информация о кодах веб-событий может бытьнашел здесь - http://msdn.microsoft.com/en-us/library/ff650306.aspx

0 голосов
/ 13 апреля 2011

Единственный способ, которым я знаю, как это сделать без использования Flash или ActiveX, это установить для maxRequestLength высокое значение, а затем использовать JavaScript для доступа к информации о файле, как только он станет доступным, а затем обработать отмену / обработку ошибок , Для этого я использовал элемент управления загрузкой Telerik , но вы должны быть в состоянии сделать что-то подобное.

...