Подтвердить что ты не робот

Как разрешить исключение "превышение максимальной длины запроса"?

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

<httpRuntime maxRequestLength="100000" />

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

Ответ 3

Это не потрясающий способ сделать это, поскольку вы в основном открываете свой сервер для 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);
        }
    }