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

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

Ответы [ 6 ]

6 голосов
/ 24 сентября 2008

Как вы говорите, вы можете настроить 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>

и т. Д.

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

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

1 голос
/ 08 мая 2009

Сергей

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

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

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

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

1 голос
/ 24 сентября 2008

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

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

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

0 голосов
/ 26 августа 2011

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

0 голосов
/ 24 сентября 2008

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

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

Обновление:

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

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

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

0 голосов
/ 24 сентября 2008

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

...