ASP.net HTTP 404 - файл не найден вместо исключения MaxRequestLength - PullRequest
40 голосов
/ 19 января 2011

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

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

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

Ответы [ 9 ]

61 голосов
/ 11 октября 2012

Сегодня я столкнулся с этим условием (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 кэшировал некоторые настройки приложений и просто не обновил их, , поэтому я переработал пул приложений , после чего все заработало как положено.

9 голосов
/ 19 марта 2018

Мне кажется, что ни один из ответов здесь не объясняет почему вы получаете 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
8 голосов
/ 10 июля 2013

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

Я столкнулся с той же проблемой при загрузке больших файлов и веб-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>

Затем, в моем контроллере ошибок, у меня есть следующее:

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

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

1 голос
/ 20 сентября 2016

Я обнаружил, что эта проблема также может быть вызвана на 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

1 голос
/ 19 января 2011

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

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

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

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);
    }
}
0 голосов
/ 15 февраля 2019

Пределом запроса является настройка IIS. Откройте раздел «Фильтрация запросов» своего сайта в IIS и выберите «Изменить параметры запроса». Для меня это было так просто.

Более подробное руководство от Microsoft.

https://docs.microsoft.com/en-us/iis/configuration/system.webserver/security/requestfiltering/#how-to-edit-the-request-filtering-feature-settings-and-request-limits

0 голосов
/ 17 ноября 2015

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

  1. editваш Web.config -> maxRequestLength

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

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

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

0 голосов
/ 10 августа 2012

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

0 голосов
/ 22 января 2011

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

...