【问题标题】:Preventing upload of large files in ASP.NET 4.0防止在 ASP.NET 4.0 中上传大文件
【发布时间】:2011-04-30 09:31:47
【问题描述】:

我们想限制我们网站上的最大上传文件大小。我们已经在 web.config 中设置了适当的限制。我们遇到的问题是,如果上传真正大文件(例如 1 GB),整个文件在生成服务器端错误之前上传,并且无论文件是否巨大,错误的类型都不同。

有没有办法在实际上传之前检测待上传文件的大小?

这是我将请求限制为 16 MB 的相关 web.config 设置:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.web>
        <httpRuntime maxRequestLength="12288"/>
    </system.web>

    <system.webServer>
        <security>
            <requestFiltering>
                <requestLimits maxAllowedContentLength="12582912"/>
            </requestFiltering>
        </security>
    </system.webServer>
</configuration>

我尝试创建一个 HTTP 模块,以便可以在请求生命周期的早期拦截请求,但上传似乎甚至在 HttpApplicationBeginRequest 事件之前发生:

public class UploadModule : IHttpModule
{
    private const int MaxUploadSize = 12582912;

    public void Init(HttpApplication context)
    {
        context.BeginRequest += handleBeginRequest;
    }

    public void Dispose()
    {
    }

    private void handleBeginRequest(object sender, EventArgs e)
    {
        // The upload takes place before this method gets called.

        var app = sender as HttpApplication;

        if (app.Request.Files.OfType<HttpPostedFile>()
            .Any(f => f.ContentLength > MaxUploadSize))
        {
            app.Response.StatusCode = 413;
            app.Response.StatusDescription = "Request Entity Too Large";
            app.Response.End();
            app.CompleteRequest();
        }
    }
}

更新:

我知道像 Flash 这样的客户端技术可以在上传之前检测文件大小,但我们需要一个服务器端的解决方法,因为我们希望针对不支持 Flash/Java/ActiveX/Silverlight 的平台。我认为 IIS 或 ASP.NET 存在允许上传大文件的错误,尽管有限制,所以我提交了错误 here

与 HTTP 模块和处理程序相比,ISAPI 扩展是否可以让我对请求处理有更多的控制权,例如允许我在 Content-Length 标头大于允许的限制时中止上传?

更新 2:

叹息。 Microsoft 已经关闭了我作为副本提交的错误,但没有提供其他信息。希望他们不只是在这件事上丢球。

更新 3:

万岁!据微软称:

此错误已被解决,因为它已被移植到 IIS 产品团队。 IIS 团队已经修复了该错误,该错误将包含在未来的 Windows 版本中。

【问题讨论】:

  • +1 关于这个问题;我自己对这个话题很感兴趣。我的理解是,在整个请求进入之前,您无法对它做任何事情,而且您尝试使用的代码当然无法事先知道。我认为在请求管道中需要更早的时间;在客户端,或者在 IIS/ASP.NET 收到请求之前 - 当请求开始流入时。
  • 可能你可以参考这个:stackoverflow.com/questions/14032918/…

标签: asp.net iis-7 file-upload httprequest httpmodule


【解决方案1】:

有没有办法检测 在实际之前等待文件上传 上传成功了吗?

没有。这将需要访问客户端上的文件大小。允许 Web 服务器直接访问客户端上的文件会有点危险。

最好的办法是放置一行文字,说明允许的最大文件大小。

或者您可以创建某种 ActiveX 控件、Java 小程序等,这样您就不会依赖于浏览器的限制。然后你必须说服你的用户安装它。可能不是最好的解决方案。

【讨论】:

  • 正确。但是应该有一种方法可以在整个文件上传到服务器端之前检测上传的文件大小:我们可以在接收并解析请求头之后(但在处理整个请求之前)读取“Content-Length”头)。我稍后会更新。
【解决方案2】:

嗯....取决于您想要获得的低级。

创建一个充当 IIS 代理的服务应用。 (所有传入的 80 端口套接字请求都转到服务。)让服务将它接收到的所有内容传递给 IIS(网站在不同的端口或 IP 上侦听),但在收到请求时监控总请求大小。 当给定连接的大小超过您想要的限制时,关闭连接。如果您想保持礼貌,请将重定向返回到错误页面。

很傻,但它可以让您监控传输中的数据,而无需等待 IIS 交出请求。

【讨论】:

    【解决方案3】:

    Microsoft 拥有 responded on their Microsoft Connect site,其中包含以下内容:

    此错误已被解决,因为它已被移植到 IIS 产品团队。 IIS 团队已经修复了该错误,该错误将包含在未来的 Windows 版本中。

    如果您请求修复当前操作系统,则必须打开 QFE 请求。请让我知道这是否是您要走的路线。请注意,打开 QFE 请求并不一定意味着它会被批准。

    所以我想我们必须等待下一个版本的 IIS 才能修复(除非满足 QFE 请求,无论 是什么)。

    【讨论】:

      【解决方案4】:

      问题在于,上传是使用 HTTP Post 请求一次性完成的,因此您只能在完成后检测到它。

      如果您想对此进行更多控制,您应该尝试基于 Flash 的上传小部件,该小部件具有此功能以及更多功能。看看这个链接http://www.ajaxline.com/10-most-interesting-upload-widgets

      【讨论】:

      • 你说得好像这是 HTTP 中的一个基本限制,而它实际上是 Web 服务器软件中的一个限制。
      猜你喜欢
      • 1970-01-01
      • 2011-10-19
      • 2011-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-18
      • 2014-08-06
      • 2016-03-23
      相关资源
      最近更新 更多