Как устранить исключение «максимальная длина запроса превышена»? - PullRequest
26 голосов
/ 08 сентября 2010

Когда я загружал изображение, у меня была эта ошибка:

превышена максимальная длина запроса

Как я могу решить эту проблему?

Ответы [ 3 ]

55 голосов
/ 08 сентября 2010

Добавьте следующее в ваш файл web.config:

<configuration>
   <system.web>
      <httpRuntime maxRequestLength ="2097151"/>
   </system.web>
</configuration>

Это устанавливает 2 ГБ. Не уверен, что макс.

21 голосов
/ 08 сентября 2010

Максимальная длина запросов в web.config может быть увеличена до <system.web>:

<httpRuntime maxRequestLength="100000" />

В этом примере максимальный размер устанавливается равным 100 МБ.

9 голосов
/ 27 июня 2011

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

Для этого вы можете использовать приведенный ниже пример.

Поскольку меня стонали за публикацию ссылки, я добавил то, что в конечном итоге реализовал, используя то, что узнал по ссылке, которую я ранее разместил - и это было проверено и работает на моем собственном сайте ... это предполагаетограничение по умолчанию 4 МБ.Вы можете реализовать что-то вроде этого или использовать сторонний ActiveX элемент управления.

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

Надеюсь, это полезно.

public class Global : System.Web.HttpApplication {
    private static long maxRequestLength = 0;

    /// <summary>
    /// Returns the max size of a request, in kB
    /// </summary>
    /// <returns></returns>
    private long getMaxRequestLength() {

        long requestLength = 4096; // Assume default value
        HttpRuntimeSection runTime = ConfigurationManager.GetSection("system.web/httpRuntime") as HttpRuntimeSection; // check web.config
        if(runTime != null) {
            requestLength = runTime.MaxRequestLength;
        }
        else {
            // Not found...check machine.config
            Configuration cfg = ConfigurationManager.OpenMachineConfiguration();
            ConfigurationSection cs = cfg.SectionGroups["system.web"].Sections["httpRuntime"];
            if(cs != null) {
                requestLength = Convert.ToInt64(cs.ElementInformation.Properties["maxRequestLength"].Value);
            }
        }
        return requestLength;
    }

    protected void Application_Start(object sender, EventArgs e) {
        maxRequestLength = getMaxRequestLength();
    }

    protected void Application_End(object sender, EventArgs e) {

    }

    protected void Application_Error(object sender, EventArgs e) {
        Server.Transfer("~/ApplicationError.aspx");
    }

    public override void Init() {
        this.BeginRequest += new EventHandler(Global_BeginRequest);
        base.Init();
    }

    protected void Global_BeginRequest(object sender, EventArgs e) {

        long requestLength = HttpContext.Current.Request.ContentLength / 1024; // Returns the request length in bytes, then converted to kB

        if(requestLength > maxRequestLength) {
            IServiceProvider provider = (IServiceProvider)HttpContext.Current;
            HttpWorkerRequest workerRequest = (HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest));

            // Check if body contains data
            if(workerRequest.HasEntityBody()) {

                // Get the total body length
                int bodyLength = workerRequest.GetTotalEntityBodyLength();

                // Get the initial bytes loaded
                int initialBytes = 0;
                if(workerRequest.GetPreloadedEntityBody() != null) {
                    initialBytes = workerRequest.GetPreloadedEntityBody().Length;
                }
                if(!workerRequest.IsEntireEntityBodyIsPreloaded()) {
                    byte[] buffer = new byte[512000];

                    // Set the received bytes to initial bytes before start reading
                    int receivedBytes = initialBytes;
                    while(bodyLength - receivedBytes >= initialBytes) {

                        // Read another set of bytes
                        initialBytes = workerRequest.ReadEntityBody(buffer, buffer.Length);

                        // Update the received bytes
                        receivedBytes += initialBytes;
                    }
                    initialBytes = workerRequest.ReadEntityBody(buffer, bodyLength - receivedBytes);
                }
            }

            try {
                throw new HttpException("Request too large");
            }
            catch {
            }

            // Redirect the user
            Server.Transfer("~/ApplicationError.aspx", false);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...