Вы загружаете файлы после ограничения длины запроса Asp.net? - PullRequest
1 голос
/ 23 марта 2009

Я искал SO и нашел этот вопрос , но это не совсем то, что я спрашиваю. Мне интересно, можно ли создать модуль IHttpModule, который может проверять ContentLength запроса, и если это так, либо перенаправить, либо каким-то образом выбросить этот запрос и создать новый.

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

    private void context_BeginRequest(object sender, EventArgs e)
    {
        HttpApplication application = (HttpApplication)sender;
        HttpContext context = application.Context;

        if (context.Request.ContentLength > (4 * 1024 * 1024))
        {

        }
    }

Путь выполнения входит в этот блок IF, как я хочу. Но отсюда я не совсем уверен, куда идти. Это плохой подход?

Редактировать: как есть (без этого модуля), Fiddler сообщает, что IIS возвращает код 500. Я хотел бы избежать этого и заставить код возвращать 200 с запрошенной страницы, просто с предупреждением, как я сказал.

Ответы [ 4 ]

4 голосов
/ 25 марта 2009

Из-за природы HTTP вы ничего не можете вернуть, пока не прочитаете все данные запроса. Когда вы получаете негабаритный запрос, у вас есть два варианта:

  • Прочитайте все данные и затем верните красивую страницу с ошибкой. Это звучит хорошо, но означает, что пользователь должен ждать завершения загрузки, прежде чем он получит сообщение, которое он не может загрузить. Это также открывает возможное отверстие для атаки DOS
  • Немедленно прекратить запрос. Это дает пользователю дрянную страницу отключения, но сохраняет безопасность.

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

1 голос
/ 23 марта 2009

Дайте это чтение

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("/ProjectReleases.aspx?Mode=Create", StringComparison.OrdinalIgnoreCase))
        {
            try
            {
                Response.Redirect("http://anyurl", true);
            }
            catch (HttpException ex)
            {
                if (String.Compare(ex.Message, "Maximum request length exceeded.", StringComparison.Ordinal) != 0)
                {
                    Server.ClearError();
                    Response.ClearHeaders();
                    Response.Redirect("http://www.edward-williams.com", true);
                }
            }
        }
    }

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

0 голосов
/ 23 марта 2009

Если все, что вы хотите сделать, это дать пользователю отзыв о состоянии загрузки больших изображений, то я бы рекомендовал вам рассмотреть возможность использования одного из компонентов загрузки на основе Ajax или Flash. Их там около миллиона, и большинство из них имеют очень хорошие отзывы пользователей. Они также могут работать с большими файлами, и многие из них также обрабатывают несколько одновременных загрузок файлов.

...