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

Jac*_*cob 15 asp.net iis-7 file-upload httpmodule httprequest

我们想在我们的网站上限制最大上传文件大小.我们已经在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>
Run Code Online (Sandbox Code Playgroud)

我已经尝试创建一个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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:

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

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

更新2:

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

更新3:

万岁!根据微软的说法:

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

Jac*_*cob 3

Microsoft在其 Microsoft Connect 网站上做出了以下回应:

该错误已被移交给 IIS 产品团队,正在得到解决。IIS 团队已经修复了该错误,该错误将包含在 Windows 的未来版本中。

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

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