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

时间:2010-10-25 19:08:38

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

我们希望限制网站中的最大上传文件大小。我们已经在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模块,因此我可以在请求生命周期的早期拦截请求,但上传似乎发生在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等客户端技术可以在上传之前检测文件大小,但我们需要服务器端解决方法,因为我们希望定位没有Flash / Java / ActiveX / Silverlight支持的平台。我相信IIS或ASP.NET有一个错误,允许上传大文件,尽管有限制,所以我提交了一个错误here

ISAPI扩展是否会让我对HTTP模块和处理程序更多地控制请求处理,例如,如果看到Content-Length标头大于允许的限制,允许我中止上传?

更新2:

。微软已经关闭了我作为副本提交的错误,但没有提供其他信息。希望他们不仅仅是放弃了这一点。

更新3:

万岁!根据微软的说法:

  

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

4 个答案:

答案 0 :(得分:2)

  

有没有办法检测a的大小   实际上挂起的文件上传   上传发生了?

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

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

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

答案 1 :(得分:2)

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

如果您想要更多地控制它,您应该尝试使用基于Flash的上传小部件,这些小部件具有此功能。查看此链接http://www.ajaxline.com/10-most-interesting-upload-widgets

答案 2 :(得分:2)

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

  

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

     

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

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

答案 3 :(得分:0)

嗯....取决于你想要达到的低水平。

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

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