Подтвердить что ты не робот

ASP.NET - как показать страницу с ошибкой при загрузке большого файла (превышена максимальная длина запроса)?

Приложение, способное записывать ошибку в OnError, но мы не можем перенаправлять или так показывать что-то значимое для пользователя. Есть идеи? Я знаю, что мы можем установить maxRequestLength в web.config, но в любом случае пользователь может превысить этот предел, и необходимо показать некоторую нормальную ошибку.

4b9b3361

Ответ 1

Как вы говорите, вы можете установить maxRequestLength в свой web.config(переопределяя по умолчанию 4MB вашего machine.config), и если эти ограничения превышены, вы обычно получаете ошибку HTTP 401.1.

Чтобы обрабатывать общую ошибку HTTP на уровне приложения, вы можете настроить раздел CustomError в своем web.config в разделе system.web:

<system.web>
   <customErrors mode=On defaultRedirect=yourCustomErrorPage.aspx />
</system.web>

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

Если вам нужна специализированная страница для каждой ошибки, вы можете сделать что-то вроде:

<system.web>    
   <customErrors mode="On" defaultRedirect="yourCustomErrorPage.aspx">
     <error statusCode="404" redirect="PageNotFound.aspx" />
   </customErrors>
</system.web>

И так далее.

В качестве альтернативы вы можете отредактировать вкладку CustomErrors свойств виртуального каталога из IIS, чтобы указать на нужные страницы обработки ошибок.

Вышеупомянутое не работает для ошибок 401.x - эта статья кода-проекта объясняет обходной путь для того, что кажется очень похожей проблемой: Перенаправление на пользовательскую страницу 401

Ответ 2

К сожалению, вам, вероятно, понадобится IIS7 и поймать это с помощью специального обработчика, так как IIS6 никогда не дойдет до стадии, где он сможет увидеть размер файла. Он может знать только размер, когда он загружал или получил ошибку.

Это известная проблема в ASP.NET. Другой (хромой) альтернативой является обработка этого ранее в запросе и, возможно, использование загрузчика с флэш-памятью. Джон ссылается на несколько ссылок ниже.

Обновление: Джон Галлоуэй, казалось, посмотрел глубже в эту проблему и кажется, что RIA-uploader является единственной разумной альтернативой, так как IIS, похоже, всегда должен усвоить файл И ТОГДА скажите, что он большой.

Ответ 3

Сергей,

В ответе от JohnIdol вам нужно настроить страницу пользовательских ошибок для кода статуса 413. например:.

    <customErrors mode="On" defaultRedirect="~/Errors/Error.aspx">
                    <error statusCode="413" redirect="~/Errors/UploadError.aspx"/>
    </customErrors>

Я знаю, потому что мне пришлось решить ту же проблему в клиентском проекте, и это было решение, которое сработало для меня. К сожалению, это было единственное решение, которое я нашел... не удалось уловить эту конкретную проблему в коде; например, проверять длину опубликованного файла, как предположил snomag, или ловить ошибку в global.asax. Как и вы, я также пробовал эти другие подходы, прежде чем я придумал рабочее решение. (на самом деле я в конце концов нашел это где-то в Интернете, когда я работал над своей проблемой).

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

Ответ 4

Вы должны уловить ошибку в обработчике Global.asax - OnError(). Но, к сожалению, ваш первоначальный запрос будет завершен, и вы не сможете отобразить одну и ту же страницу загрузки с некоторым уведомлением об ошибке пользователю.

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

Обновление:

Мне пришлось выполнить точную проверку загрузки файла в последнее время, и я придумал SWFUpload библиотеку, которая полностью соответствовала моим требованиям и также имеет множество дополнительных функций. Я использовал его вместе с оберткой jquery, предоставленной Стивом Сандерсоном. Более подробную информацию можно найти здесь.

Дело в том, что флэш-память может определять размер файла на стороне клиента и правильно реагировать, если этот случай выполняется. И я думаю, что это именно то, что вам нужно.

Кроме того, вы можете реализовать проверку обнаружения флэш-памяти, если вы хотите изящно деградировать на собственную кнопку загрузки0, если клиент не установил флешку.

Ответ 5

Лучший способ обработки больших загрузок - использовать решение, которое реализует HttpModule, который разбивает файл на куски. Любой из предварительно развернутых решений там должен позволить вам ограничить размер файла. Множество других разместили ссылки на тех, кто на этой странице, поэтому я не буду беспокоиться. Однако, если вы не хотите беспокоиться об этом, вы можете справиться с этим в своем приложении Global.asax Application_Error. Если ваше приложение .NET 4.0, вставьте этот блок кода в него:

    if (ex.InnerException != null && ex.InnerException.GetType() == typeof(HttpException) && ((HttpException)ex.InnerException).WebEventCode == System.Web.Management.WebEventCodes.RuntimeErrorPostTooLarge)
    {
        //Handle and redirect here, you can use Server.ClearError() and Response.Redirect("FileTooBig.aspx") or whatever you choose
    }

Источник: http://justinyue.wordpress.com/2010/10/29/handle-the-maximum-request-length-exceeded-error-for-asyncfileupload-control/

Если вы используете более раннюю структуру, попробуйте код здесь (он в VB, но его легко перевести): http://www.webdeveloper.com/forum/showthread.php?t=52132

Ответ 6

Вы можете проверить длину опубликованного файла (FileUpload.PostedFile.ContentLength), чтобы узнать, находится ли он ниже предела или нет, и просто при необходимости показывать приветственное сообщение об ошибке.