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

ASP.net HTTP 404 - Файл не найден вместо исключения MaxRequestLength

У меня есть элемент управления загрузкой файлов на моей веб-странице. Максимальная длина запроса установлена ​​равной 8 МБ (maxRequestLength = 8192). У меня также есть проверка сервера, которая выдает ошибку, если файл больше 4 МБ. Причина, по которой его 8 МБ в конфигурации - это рычаг, который предоставляется пользователю, а также для проверки приложения.

Если я выгружаю файл с 9 МБ, я получаю исключение. Максимальная длина запроса превышена. Это нормально и работает как ожидалось. Но когда я пытаюсь загрузить файл размером 1 ГБ, он показывает мне HTTP 404 - Файл не найден. Может кто-нибудь объяснить, почему это происходит, и как я могу заставить его исключить исключение maxRequestLength?

Я использую IIS6.

4b9b3361

Ответ 1

Я испытал это состояние сегодня (HTTP 404 при большой загрузке файлов с IIS 7), но я думал, что сделал все правильные настройки конфигурации. Я хотел загружать файлы до 300 МБ, поэтому я сделал следующие настройки web.config в подпапке приложения:

<configuration>
    <system.web>
        <httpRuntime maxRequestLength="307200" />
    </system.web>
    <system.webServer>
        <security>
            <requestFiltering>
                <requestLimits maxAllowedContentLength="314572800" />
            </requestFiltering>
        </security>
    </system.webServer>
</configuration>

Эта конфигурация работала в тесте, но когда я скопировал обновленные файлы, включая web.config, на рабочий сервер, я получил ошибку HTTP 404 при загрузке 90 МБ файла. Меньшие файлы под общим ограничением 30 МБ работали нормально, поэтому я знал, что это проблема с размером запроса.

Я понял, что у IIS были кешированные некоторые параметры приложения, и они просто не обновили их, , поэтому я переработал пул приложений, после чего все работало как ожидалось.

Ответ 2

Это немного старый поток, но я подумал, что должен добавить свой опыт.

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

Моим решением были следующие записи в web.config:

Я обрабатываю 404.13, перенаправляя его на контроллер mvc (это может быть страница веб-форм одинаково), и обычные 404 ошибки попали в мой маршрут 404. это критически важно, чтобы responseMode = "redirect" для 404.13

<httpErrors errorMode="Custom">
  <remove statusCode="404" subStatusCode="-1" />            
  <error statusCode="404" subStatusCode="13" path="/errors/filesize" responseMode="Redirect" />
  <error statusCode="404" path="/errors/notfound" responseMode="ExecuteURL" />      
</httpErrors>

Затем в моем контроллере Errors у меня есть следующее:

public ActionResult FileSize()
{
    Response.StatusCode = 500;
    Response.StatusDescription = "Maximum file size exceeded.";
    Response.End();
    return null;
}

Опять же, это может быть обычная страница веб-форм.

Ответ 3

Насколько мне известно, нет способа изящно обрабатывать значение параметра "maxRequestLength" IIS. Он даже не может отображать страницу пользовательских ошибок (поскольку для ответа на соответствующий HTTP-код нет). Единственный способ этого - установить maxRequestLength на какое-то абсурдно большое количество килобайт, например 51200 (50 МБ), а затем проверить ContentLength после того, как файл был загружен (при условии, что запрос не тайм-аут до 90 секунд). В этот момент я могу проверить, есть ли файл <= 5MB и показать дружественную ошибку.

Вы также можете попробовать эту ссылку.

Вы также можете попробовать что-то вроде этого:

private void application_EndRequest(object sender, EventArgs e)
{
    HttpRequest request = HttpContext.Current.Request;
    HttpResponse response = HttpContext.Current.Response;

    if ((request.HttpMethod == "POST") &&
        (response.StatusCode == 404 && response.SubStatusCode == 13))
    {
        // Clear the response header but do not clear errors and transfer back to requesting page to handle error
        response.ClearHeaders();
        HttpContext.Current.Server.Transfer(request.AppRelativeCurrentExecutionFilePath);
    }
}

Ответ 4

Я чувствую, что ни один из ответов здесь не объясняет, почему вы получаете 404, они просто рассказывают вам, как исправить эту проблему.

404 не вызвано неправильной конфигурацией, преднамеренное и задокументированное поведение:

Когда фильтрация запросов блокирует HTTP-запрос, потому что HTTP-запрос превышает пределы запроса, IIS 7 возвращает клиенту HTTP-ошибку 404 и регистрирует один из следующих состояний HTTP с уникальным подпунктом, который идентифицирует причину, по которой запрос был отказано:

HTTP Substatus    Description

404.13            Content Length Too Large
404.14            URL Too Long
404.15            Query String Too Long

Эти подстанции позволяют веб-администраторам анализировать журналы IIS и определять потенциальные угрозы.

Кроме того, когда HTTP-запрос превышает пределы заголовка, определенные в элементе <headerLimits>, IIS 7 возвращает клиенту HTTP 404 ошибку со следующим подключением:

HTTP Substatus    Description

404.10            Request Header Too Long

Ответ 5

Вы можете настроить страницу ошибок по умолчанию в самом IIS.

Ответ 7

Я обнаружил, что эта проблема также может быть вызвана IIS7 (и предположительно IIS6), когда инструмент URLScan установлен и запущен на сайте.

При загрузке файла на сайт я получал сообщение "Файл или каталог не найден. Возможно, ресурс, который вы ищете, был удален, изменилось его имя или временно недоступно".

Если проблема вызвана URLScan, то если вы попытаетесь загрузить большой файл на сайт во время просмотра сайта на сервере хостинга, вам будет отправлено полное сообщение об ошибке asp.net вместо 404, в котором упоминается URLScan. Вы также можете проверить, запущен ли URLScan на вашем сайте в IIS7, просмотрев фильтры ISAPI для веб-сайта в IIS, URLScan будет указан, если он используется.

Это можно устранить, изменив ini файл для URLScan, расположенный в "% WINDIR%\System32\Inetsrv\URLscan" и изменив MaxAllowedContentLength. MaxAllowedContentLength находится в байтах.

Для этого может потребоваться перезагрузка IIS, хотя это не произошло, когда я попробовал сам с IIS7.

http://www.iis.net/learn/extensions/working-with-urlscan/urlscan-overview

http://www.iis.net/learn/extensions/working-with-urlscan/common-urlscan-scenarios

Ответ 8

Я только что встретил ту же проблему, я сделал аналогичную операцию как pseudocoder, но имел разные (я думаю, может быть, это не кеш):

  • отредактируйте свой Web.config → maxRequestLength

    <system.web>
    <httpRuntime maxRequestLength="1073741824" executionTimeout="3600" />
    </system.web>
    
  • отредактируйте это:

    <security>
          <requestFiltering>
            <requestLimits maxAllowedContentLength="1073741824" />
          </requestFiltering>
    </security>
    

просто так и попробуйте.

Ответ 9

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