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

StackOverflow https://stackoverflow.com/questions/126167

Вопрос

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

Это было полезно?

Решение

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

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

<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 - в этой статье code-project объясняется обходной путь для того, что кажется очень похожей проблемой: Перенаправление на пользовательскую страницу 401

Другие советы

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

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

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

Сергей,

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

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

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

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

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

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

Обновить:

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

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

Более того, вы можете реализовать проверку обнаружения flash, если хотите корректно перейти к встроенной кнопке загрузки 0 в случае, если у клиента не установлена flash.

Лучший способ обрабатывать большие загрузки - использовать решение, которое реализует HttpModule, который разбивает файл на фрагменты.Любое из существующих готовых решений должно позволять вам ограничивать размер файла.Многие другие разместили ссылки на них на этой странице, так что я не буду утруждать себя.Однако, если вы не хотите беспокоиться об этом, вы может обработайте это в глобальном событии Application_Error вашего приложения.asax.Если ваше приложение работает на .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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top