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

问题描述 投票:40回答:9

我的网页上有文件上传控件。最大请求长度设置为8 MB(maxRequestLength = 8192)。我还有服务器验证,如果文件超过4MB则抛出错误。它在配置中的8MB是为用户提供的杠杆,也是为了测试应用程序的原因。

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

我正在使用IIS6。

asp.net http-status-code-404 iis-6
9个回答
62
投票

我今天遇到了这种情况(使用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有可能缓存了一些应用程序设置并且没有更新它们,所以我回收了应用程序池,之后一切都按预期工作。


10
投票

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

404不是由于配置错误,它是intentional and documented behaviour

当请求筛选由于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

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

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

HTTP Substatus    Description

404.10            Request Header Too Long

8
投票

这是一个旧的线程,但我想我应该添加我的经验。

我遇到了大文件上传和web api的同样问题。 404.13在它到达控制器之前被抛出,因此我必须找出跳入的位置并处理这种情况。

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

我通过将它重定向到mvc控制器来处理404.13(它可能是一个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>

然后,在我的Errors控制器中,我有以下内容:

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

同样,这可能是一个常规的webforms页面。


1
投票

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

你也可以试试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);
    }
}

1
投票

我发现在网站上安装并运行URLScan工具时,也可能在IIS7(以及可能是IIS6)上引起此问题。

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

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

这可以通过更改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


0
投票

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


0
投票

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


-2
投票

我刚刚遇到了同样的问题,我做了类似于伪编码器的答案,但有不同(我想可能不是缓存):

  1. 编辑你的Web.config - > maxRequestLength <system.web> <httpRuntime maxRequestLength="1073741824" executionTimeout="3600" /> </system.web>
  2. 编辑这个: <security> <requestFiltering> <requestLimits maxAllowedContentLength="1073741824" /> </requestFiltering> </security>

就像这样,尝试一下。


-10
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.