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

Div*_*ivi 41 asp.net iis-6 http-status-code-404

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

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

我正在使用IIS6.

pse*_*der 66

我今天遇到了这种情况(使用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>
Run Code Online (Sandbox Code Playgroud)

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

我认为IIS有可能缓存了一些应用程序设置并且没有更新它们,所以我回收了应用程序池,之后一切都按预期工作.

  • +1:对我来说应该是正确的答案.我第一次遇到500错误,所以我添加`maxRequestLength`但增加文件大小我遇到错误404和'maxAllowedContentLength`是解决方案.谢谢 ! (2认同)

use*_*702 11

我觉得这里的答案都没有解释为什么你得到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

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

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

HTTP Substatus    Description

404.10            Request Header Too Long


Sco*_*ttE 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>
Run Code Online (Sandbox Code Playgroud)

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

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

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


Sco*_*ott 3

据我所知,没有办法优雅地处理超过 IIS 的“maxRequestLength”设置。它甚至无法显示自定义错误页面(因为没有相应的 HTTP 代码可以响应)。解决此问题的唯一方法是将 maxRequestLength 设置为某个高得离谱的千字节数,例如 51200 (50MB),然后在文件上传后检查 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);
    }
}
Run Code Online (Sandbox Code Playgroud)