ASP.net HTTP 404 - 找不到文件而不是 MaxRequestLength 异常

Posted

技术标签:

【中文标题】ASP.net HTTP 404 - 找不到文件而不是 MaxRequestLength 异常【英文标题】:ASP.net HTTP 404 - File not found instead of MaxRequestLength exception 【发布时间】:2011-06-11 12:06:52 【问题描述】:

我的网页上有一个文件上传控件。最大请求长度设置为 8 MB (maxRequestLength = 8192)。如果文件超过 4MB,我也有服务器验证会引发错误。配置中 8MB 的原因是给予用户的杠杆作用,也是为了测试应用程序。

如果我上传一个 9MB 的文件,我会抛出一个异常超出最大请求长度。,这很好并且可以按预期工作。但是当我尝试上传一个 1GB 的文件时,它会显示一个 HTTP 404 - 找不到文件。有人可以解释为什么会发生这种情况,我怎样才能让它抛出一个 maxRequestLength 异常

我正在使用 IIS6。

【问题讨论】:

有人有解决方案吗?当我上传一个 50mb 的文件时,我得到一个 404 结果,即使我的 maxRequestLength 设置为“2097152”。我的网站上有一个 HTTP POST flash 控件,它可以毫无问题地上传接近 2GB,但这个问题让我抓狂! 【参考方案1】:

我今天遇到了这种情况(使用 IIS 7 上传大文件时出现 HTTP 404),但我认为我已经进行了所有正确的配置设置。我想上传最大 300MB 的文件,所以我在应用程序的子文件夹中进行了以下 web.config 设置:

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

此配置在测试中有效,但是当我将包括 web.config 在内的更新文件复制到生产服务器时,我在上传 90MB 文件时收到 HTTP 404 错误。应用程序范围限制为 30MB 的较小文件可以正常工作,所以我知道这是某种请求大小问题。

我认为 IIS 有可能缓存了一些应用程序设置,只是没有更新它们,所以我回收了应用程序池,之后一切正常。

【讨论】:

+1 :对我来说应该是正确的答案。我第一次遇到 500 错误,所以我添加了maxRequestLength,但增加了文件大小我遇到了错误 404,maxAllowedContentLength 是解决方案。谢谢! 您在哪个子文件夹中制作了 web.config? 上传页面所在的子文件夹。默认情况下,web.config 中的设置适用于该文件夹及其子文件夹中的所有页面。您还可以使用 元素来指定特定文件。 我第一次错过了这个,但是对于任何阅读的人,不要忘记 maxRequestLength 以 KB 为单位,而 maxAllowedContentLength 以字节为单位! maxAllowedContentLength 任意大有什么坏处吗? maxAllowedContentLength 总是在 maxRequestLength 之前触发,这使得处理异常变得棘手。如果他们真的做同样的事情,我想不出有必要进行两次检查。【参考方案2】:

我觉得这里的答案都没有解释为什么你会得到一个 404,他们只是告诉你如何解决问题的常见内容。

404不是因为配置错误,是intentional and documented behaviour:

当请求过滤因为 HTTP 请求超出请求限制而阻止 HTTP 请求时,IIS 7 将向客户端返回 HTTP 404 错误并记录以下 HTTP 状态之一,并带有唯一的子状态,该子状态标识请求被执行的原因拒绝:

HTTP 子状态描述 404.13 内容长度太大 404.14 URL 太长 404.15 查询字符串太长

这些子状态允许 Web 管理员分析他们的 IIS 日志并识别潜在威胁。

此外,当 HTTP 请求超出 &lt;headerLimits&gt; 元素中定义的标头限制时,IIS 7 将向客户端返回 HTTP 404 错误,并具有以下子状态:

HTTP 子状态描述 404.10 请求标头太长

【讨论】:

信息丰富,但仍然没有真正解释为什么它是一个潜在的误导性 404 Not Found 而不是任何其他 4xx 代码(400 och 413)。可能假定它可能是某种攻击,避免它的最佳方法是假装文件根本不存在。【参考方案3】:

这是一个有点旧的线程,但我认为我应该添加我的经验。

我在上传大文件和 web api 时遇到了同样的问题。一个 404.13 在它到达控制器之前就被抛出,所以我必须找出在哪里跳入并处理这种情况。

我的解决方案是以下 web.config 条目:

我通过将 404.13 重定向到一个 mvc 控制器(它可能是一个 webforms 页面)来处理它,并且常规的 404 错误命中了我的 404 路由。 404.13 的 responseMode="redirect" 很重要

<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;

同样,这可能是一个常规的网络表单页面。

【讨论】:

该代码专门处理子状态 13,但一般处理所有其他子状态。 subscstatus -1(默认)删除该状态的所有处理程序。我认为代码示例并没有说明这一点,但 +1 提到 .13 必须具有重定向而不是 ExecuteURL。 这个答案救了我的命。这似乎是改变 &lt;requestLimits maxAllowedContentLength="NUMBER" /&gt; 行为的唯一方法,它总是在 IIS 7+ 中的 &lt;httpRuntime maxRequestLength="NUMBER" /&gt; 之前触发。【参考方案4】:

据我所知,没有办法优雅地处理超过 IIS 的“maxRequestLength”设置。它甚至不能显示自定义错误页面(因为没有相应的 HTTP 代码可以响应)。解决这个问题的唯一方法是将 maxRequestLength 设置为一些荒谬的千字节数,例如 51200 (50MB),然后在文件上传后检查 ContentLength(假设请求在 90 秒之前没有超时)。此时,我可以验证文件是否

你也可以试试this link。

你也可以试试这样的:

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);
    

【讨论】:

谢谢斯科特。但它甚至没有命中 Application_EndRequest【参考方案5】:

我发现在站点上安装并运行 URLScan 工具时,IIS7(可能是 IIS6)也可能导致此问题。

将文件上传到网站时,我收到消息“找不到文件或目录。您要查找的资源可能已被删除、更改名称或暂时不可用。”

如果问题是由 URLScan 引起的,那么如果您在托管服务器本身上浏览网站时尝试将大文件上传到该网站,您将收到完整的 asp.net 错误消息,而不是提到的 404网址扫描。 您还可以通过查看 IIS 中网站的 ISAPI 过滤器来检查是否在 IIS7 中的站点上运行 URLScan,如果使用了 URLScan,则会列出。

这可以通过更改 URLScan 的 ini 文件位于“%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

【讨论】:

【参考方案6】:

您可以在 IIS 本身中配置默认​​错误页面。

【讨论】:

【参考方案7】:

请求限制是一个设置是 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

【讨论】:

【参考方案8】:

我刚刚遇到了同样的问题,我做了类似 pseudocoder's 的回答但有不同的操作(我认为可能不是缓存):

    编辑您的 Web.config --> maxRequestLength

    <system.web>
    <httpRuntime maxRequestLength="1073741824" executionTimeout="3600" />
    </system.web>
    

    编辑:

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

就这样,试试吧。

【讨论】:

maxRequestLengthmaxAllowedContentLength 使用不同的单位,一个以字节为单位,另一个以千字节为单位,因此您不能在两者上使用相同的数字。检查谷歌看看哪个是哪个【参考方案9】:

1GB 上传的问题与浏览器有关。我遇到了很多麻烦并尝试了很多解决方案,但这里真正要问的问题是在现实世界中发生这种情况以满足您的业务需求的可能性有多大,也许应该将其记录为业务中的已知问题规则或非功能性需求文档。

【讨论】:

此回复没有帮助。它提示“与浏览器更相关”的信息,但没有提供可用于解决问题的信息 问题与 IIS 相关,与浏览器无关。请参阅@pseudocoder 的答案,它设置了maxAllowedContentLengthmaxRequestLength DarK,如果您删除此答案,您将获得积分......!

以上是关于ASP.net HTTP 404 - 找不到文件而不是 MaxRequestLength 异常的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC:404 - 找不到文件或目录。您正在寻找的资源

ASP.NET MVC 页面无法加载并显示“找不到资源”

ASP.NET MVC 5 - (HTTP 错误 404.0 - 未找到)具有长的不存在的 URL

自定义 ASP.NET MVC 404 错误页面的路由

\.net发布前调试没问题 可发布后找不到url

iis6 上的 Asp.net mvc 4:“找不到页面”