Отображение значимой ошибки при загрузке слишком большого файла - PullRequest
3 голосов
/ 05 мая 2009

Мы установили фиксированный лимит на размер файлов для загрузки на нашем сайте - ниже размера по умолчанию для asp.net и настройки iis.

У меня есть простая настройка перехвата в Application_BeginRequest, которая ловит это (это не excat, поскольку он проверяет ContentLength, включая все другие данные формы, но это достаточно хорошо). Я хочу либо возобновить обработку страницы, на которую пытался загрузить пользователь, либо в качестве запасного плана перенаправить пользователя на страницу, объяснив, что размер файла был слишком большим (у нас уже есть подзаголовок, объясняющий это, но вы знаете пользователей - ' им не нужно читать никаких вонючих субтитров ».

Так в чем же проблема? Что ж, похоже, что мой Ответ уже был отправлен пользователю - 404, объясняющий, что страница не может быть найдена. Я не хочу такого поведения, я хочу сбросить этот ответ, так как это не тот, который я хочу, чтобы пользователь видел - я хочу показать что-то другое - создать свой собственный ответ, перенаправить или просто обработать страницу, которую он должен был получить в любом случае.

Я думаю, что проблема все еще в том, что IIS отклоняет запрос / публикацию, поскольку файл больше, чем того требует IIS. Я действительно это копаю - сумасшедшему пользователю, пытающемуся загрузить 20-миллиметровую картинку, нельзя позволять делать IIS на коленях, но так ли это? Или я получу шанс перехватить этот ответ для пользователя - вместо того, чтобы увеличить максимальный размер IIS и, следовательно, тратить полосу пропускания на получение этого файла, я просто хочу идентифицировать этот пост как «слишком большой» и посылать соответствующий ответ назад к пользователю.

Ответы [ 3 ]

3 голосов
/ 10 сентября 2009

Отличный ресурс!

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

web.config ->

    < customErrors mode="RemoteOnly" defaultRedirect="~/GenericError.htm" />

MyPage.aspx.cs ->

    protected void Page_Error(object sender, EventArgs e)
    {
        if (HttpContext.Current.Error is HttpException)
            if ((HttpContext.Current.Error as HttpException).ErrorCode == -2147467259)
            {
                Server.ClearError();
                Response.Redirect(@"~/FileSizeError.htm", false);
            }
    }
2 голосов
/ 05 мая 2009

У меня была такая же проблема, и после долгих поисков, похоже, нет идеального решения. Вы можете изменить максимальную длину запроса, чтобы установить, в какой момент IIS будет обслуживать ошибку ASP.Net. Вы также можете перехватить эту ошибку на global.asax и показать пользователю более дружелюбную страницу с ошибкой.

Подробнее об этом можно узнать здесь http://www.developer.com/db/article.php/10920_3426051_2

0 голосов
/ 20 марта 2013

Ответы выше не работали для меня на IIS 7.5. Мы наконец придумали следующее:

void Application_PreSendRequestHeaders(Object sender, EventArgs e)
{
    if (
        Request.Headers["Content-Length"] != null && 
        int.Parse(Request.Headers["Content-Length"]) > 150000000 &&
        Request.RawUrl.EndsWith("/Release/ProjectReleases.aspx?Mode=Create"))
    {
        try
        {
            Response.Redirect("http://anyurl", true);
        }
        catch (HttpException ex)
        {
            if (ex.Message == "Maximum request length exceeded.")
            {
                Server.ClearError();
                Response.ClearHeaders();
                Response.Redirect("http://www.edward-williams.com", true);
            }
        }
    }
}

Не нужно было изменять максимальный размер загрузки. Получив окончательную версию, на самом деле установите статическое значение для максимального размера загрузки на основе значения в web.config и перенаправьте на пользовательскую страницу с ошибкой по сравнению с этой домашней страницей, но вы поняли идею.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...