上传文件超过Asp.net请求长度限制?

时间:2009-03-23 18:28:44

标签: asp.net upload file-upload

我搜索了SO并找到了this question,但这并不是我所要求的。我想知道是否可以创建一个可以检查请求的ContentLength的IHttpModule,如果是这样,重定向或以某种方式抛出该请求并创建一个新请求。

具体来说,我正在尝试处理图像文件上传,但我希望请求继续上传页面,并发出某种警告,而不是平面错误页面。我有一些代码被大量请求命中:

    private void context_BeginRequest(object sender, EventArgs e)
    {
        HttpApplication application = (HttpApplication)sender;
        HttpContext context = application.Context;

        if (context.Request.ContentLength > (4 * 1024 * 1024))
        {

        }
    }

执行路径像我想要的那样进入IF块。但是从这里开始,我不确定该去哪里。这是一个糟糕的方法吗?

编辑:实际上(没有此模块),Fiddler报告IIS正在返回500代码。我想避免这种情况,让代码从请求的页面返回200,就像我说的那样警告。

4 个答案:

答案 0 :(得分:4)

由于HTTP的性质,在读取所有请求数据之前,您实际上无法返回任何内容。当您收到超大请求时,您有两种选择:

  • 读入所有数据,然后返回一个漂亮的错误页面。这听起来不错,但意味着用户必须等待上传完成才能收到无法上传的消息。它还打开了一个可能的DOS攻击孔
  • 立即终止请求。这为用户提供了一个糟糕的断开连接页面,但保留了安全性。

还有第三种选择 - 使用高级组件,既提供了良好的错误消息,又提供了安全性。你可以使用仅限闪存的组件,其中有很多组件,但当然,如果用户没有闪存,你就不走运了。

答案 1 :(得分:1)

this一个阅读

答案 2 :(得分:0)

如果您只想向用户提供有关大型图片上传状态的反馈,那么我建议您考虑使用基于Ajax或Flash的上传组件之一。其中大约有一百万,并且大多数都有非常好的用户反馈。它们还可以处理大型文件,还可以处理多个同时上传的文件。

答案 3 :(得分:0)

上面的答案在IIS 7.5上对我不起作用。我们终于想出了以下内容:

    void Application_PreSendRequestHeaders(Object sender, EventArgs e)
    {
        if (
            Request.Headers["Content-Length"] != null && 
            int.Parse(Request.Headers["Content-Length"]) > 150000000 &&
            Request.RawUrl.EndsWith("/ProjectReleases.aspx?Mode=Create", StringComparison.OrdinalIgnoreCase))
        {
            try
            {
                Response.Redirect("http://anyurl", true);
            }
            catch (HttpException ex)
            {
                if (String.Compare(ex.Message, "Maximum request length exceeded.", StringComparison.Ordinal) != 0)
                {
                    Server.ClearError();
                    Response.ClearHeaders();
                    Response.Redirect("http://www.edward-williams.com", true);
                }
            }
        }
    }

无需修改最大上传大小。最终版本根据web.config中的值设置了最大上传大小的静态值,并重定向到自定义错误页面与该主页,但您明白了。