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

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

6 ответов

Решение

Как вы говорите, вы можете настроить maxRequestLength в своем файле web.config (переопределяя стандартные 4 МБ вашего 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>

И так далее.

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

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

Сергей,

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

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

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

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

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

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

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

Лучший способ обработать большие загрузки - использовать решение, которое реализует 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

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

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

Обновить:

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

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

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

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

Другие вопросы по тегам