Отображение значимой ошибки при загрузке слишком большого файла

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

  •  05-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

Решение

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

Дополнительную информацию об этом можно найти здесь http: //www.developer. ком / дб / article.php / 10920_3426051_2

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

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

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

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);
            }
    }

Ответы выше не работали для меня в 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 и перенаправьте на пользовательскую страницу с ошибкой по сравнению с этой домашней страницей, но вы поняли идею.

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