繁体   English   中英

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

[英]ASP.net HTTP 404 - File not found instead of MaxRequestLength exception

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

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

我正在使用 IIS6。

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

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

404 不是由于配置错误,而是有意并记录在案的行为

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

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

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

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

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

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

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

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

我通过将 404.13 重定向到 mvc 控制器(它可能是一个 webforms 页面,只是一样)来处理 404.13,并且常规 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;
}

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

据我所知,没有办法优雅地处理超过 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);
    }
}

我发现当 URLScan 工具安装并在站点上运行时,这个问题也可能在 IIS7(大概是 IIS6)上引起。

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

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

这可以通过更改位于“%WINDIR%\\System32\\Inetsrv\\URLscan”的 URLScan 的 ini 文件并更改 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

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

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

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

  1. 编辑您的 Web.config --> maxRequestLength

     <system.web> <httpRuntime maxRequestLength="1073741824" executionTimeout="3600" /> </system.web>
  2. 编辑这个:

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

就像这样,然后尝试一下。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM