代码之家  ›  专栏  ›  技术社区  ›  Jacob

阻止在ASP.NET 4.0中上载大型文件

  •  14
  • Jacob  · 技术社区  · 15 年前

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

    是否有方法在实际上载之前检测挂起文件上载的大小?

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

    <?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模块,以便在请求生命周期的早期拦截一个请求,但是上传似乎发生在 BeginRequest 事件 HttpApplication :

    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这样的客户端技术可以在上传之前检测文件大小,但是我们需要一个服务器端的解决方案,因为我们想要的目标是没有FLAS/Java/ActiveX/Silverlight支持的平台。我相信IIS或ASP.NET有一个bug,允许上载大文件,尽管有限制,所以我提交了一个bug here .

    与HTTP模块和处理程序相比,ISAPI扩展是否会给我更多的请求处理控制权,例如,如果发现内容长度头大于允许的限制,允许我中止上载?

    更新2:

    叹息 . 微软已经关闭了我作为副本提交的bug,但没有提供其他信息。希望他们不只是把球扔在这上面。

    更新3:

    万岁!据微软称:

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

    4 回复  |  直到 14 年前
        1
  •  2
  •   Cyril Gupta    15 年前

    问题是,使用HTTPPOST请求时,上载会同时发生,因此您只能在完成后检测到它。

    如果你想要更多的控制权,你应该尝试基于flash的上传小部件,其中有这个和更多。查看此链接 http://www.ajaxline.com/10-most-interesting-upload-widgets

        2
  •  2
  •   Jacob    14 年前

    微软有 responded on their Microsoft Connect site 包括以下内容:

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

    如果您请求对当前操作系统进行修复,则必须打开一个qfe请求。如果你想走这条路,请告诉我。请注意,打开一个QFE请求并不一定意味着它将被批准。

    所以我想我们必须等待下一个版本的IIS进行修复(除非满足了qfe请求,无论 那个 是)。

        3
  •  2
  •   David    14 年前

    有没有办法检测 在实际 上传发生了吗?

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

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

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

        4
  •  0
  •   3Dave    14 年前

    好。。。。这取决于你想要达到的低水平。

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

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