Предотвращение загрузки больших файлов в ASP.NET 4.0 - PullRequest
15 голосов
/ 25 октября 2010

Мы хотели бы ограничить максимальный размер загружаемого файла на нашем веб-сайте.Мы уже установили соответствующие ограничения в нашем web.config.Проблема, с которой мы сталкиваемся, заключается в том, что если загружен действительно большой файл (например, 1 ГБ), весь файл будет загружен до того, как будет сгенерирована ошибка на стороне сервера, иТип ошибки зависит от размера файла.

Есть ли способ определить размер ожидающей загрузки файла до фактической загрузки?

Вот мой соответствующий веб-сайтНастройки .config, ограничивающие запросы 16 МБ:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.web>
        <httpRuntime maxRequestLength="12288"/>
    </system.web>

    <system.webServer>
        <security>
            <requestFiltering>
                <requestLimits maxAllowedContentLength="12582912"/>
            </requestFiltering>
        </security>
    </system.webServer>
</configuration>

Я пытался создать модуль HTTP, чтобы перехватить запрос на раннем этапе жизненного цикла запроса, но загрузка, похоже, происходит еще до того, как BeginRequest событие HttpApplication:

public class UploadModule : IHttpModule
{
    private const int MaxUploadSize = 12582912;

    public void Init(HttpApplication context)
    {
        context.BeginRequest += handleBeginRequest;
    }

    public void Dispose()
    {
    }

    private void handleBeginRequest(object sender, EventArgs e)
    {
        // The upload takes place before this method gets called.

        var app = sender as HttpApplication;

        if (app.Request.Files.OfType<HttpPostedFile>()
            .Any(f => f.ContentLength > MaxUploadSize))
        {
            app.Response.StatusCode = 413;
            app.Response.StatusDescription = "Request Entity Too Large";
            app.Response.End();
            app.CompleteRequest();
        }
    }
}

Обновление:

Я знаю, что такие технологии на стороне клиента, как Flash, могут определять размеры файлов перед загрузкой, но нам нужнообходной путь на стороне сервера, потому что мы хотим ориентироваться на платформы, которые не поддерживают Flash / Java / ActiveX / Silverlight.Я считаю, что в IIS или ASP.NET есть ошибка, которая позволяет загружать большие файлы, несмотря на ограничения, поэтому я подал ошибку здесь .

Может ли расширение ISAPI дать мне большеконтролировать обработку запросов, чем HTTP-модули и обработчики, например, позволяя мне прервать загрузку, если заголовок Content-Length больше допустимого предела?

Обновление 2:

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

Обновление 3:

Ура!Согласно Microsoft:

Эта ошибка устраняется, поскольку она была перенесена в группу разработчиков продуктов IIS.С тех пор команда IIS исправила ошибку, которая будет включена в будущий выпуск Windows.

Ответы [ 4 ]

2 голосов
/ 25 октября 2010

Проблема заключается в том, что загрузка происходит одновременно с использованием HTTP Post-запроса, поэтому вы можете обнаружить его только после того, как он сделан.

Если вы хотите больше контроля над этим, вы должны попробовать Flash-загрузку виджетов, которые имеют это и многое другое. Проверьте эту ссылку http://www.ajaxline.com/10-most-interesting-upload-widgets

2 голосов
/ 10 июня 2011

Microsoft ответила на своем сайте Microsoft Connect следующим текстом:

Эта ошибка устраняется, поскольку она была перенесена в группу разработчиков продуктов IIS. С тех пор команда IIS исправила ошибку, которая будет включена в будущий выпуск Windows.

Если вы запрашиваете исправление для текущей ОС, должен быть открыт запрос QFE. Пожалуйста, дайте мне знать, если это тот маршрут, по которому вы хотите идти. Обратите внимание, что открытие запроса QFE не обязательно означает, что он будет одобрен.

Так что, я думаю, нам нужно дождаться следующей версии IIS для исправления (если не выполнен запрос QFE, каким бы это не было ).

2 голосов
/ 25 октября 2010

Есть ли способ определить размер ожидание загрузки файла до фактического загрузка происходит?

Нет. Это потребует доступа к размеру файла на клиенте. Разрешение веб-серверу прямого доступа к файлам на клиенте было бы немного опасно.

Лучше всего разместить строку текста с указанием максимально допустимого размера файла.

ИЛИ вы можете создать какой-то элемент управления ActiveX, Java-апплет и т. Д., Чтобы не зависеть от ограничений браузера. Затем вы должны убедить своих пользователей установить его. Вероятно, не лучшее решение.

0 голосов
/ 10 июня 2011

Ну .... Зависит от того, какой низкий уровень вы хотите получить.

Создайте приложение-службу, которое действует как прокси для IIS. (Все входящие запросы сокетов порта 80 направляются в службу.) Попросите службу передать все, что она получает, в IIS (веб-сайт прослушивает другой порт или IP-адрес), но следите за общим размером запроса по мере его поступления. Когда размер данного соединения превышает желаемый предел, закройте соединение. Верните перенаправление на страницу с ошибкой, если вы хотите быть вежливым.

Глупо, но это позволит вам отслеживать данные в пути, не дожидаясь, пока IIS передаст запрос.

...