• ASP.NET文件上传大小的限制真的仅仅只需修改webconfig就可以吗?
  • 牧羊人 发表于 2016/3/4 19:52:00 | 分类标签: 上传文件 文件大小 webconfig
  • 我们大家都知道ASP.NET为我们提供了文件上传服务器控件FileUpload,默认情况下可上传的最大文件为4M,如果要改变可上传文件大小限制,那么我们可以在web.config中的httpRuntime元素中添加maxRequestLength属性设置大小,同时为了支持大文件上传超时可以添加executionTimeout属性设置超时时间。网上有很多这样的例子,但实际情况是否是这样吗?

    <httpRuntime maxRequestLength="" executionTimeout=""/>

    测试环境

    IIS 7.5、.NET 3.5 sp1

    测试页面UploadFile.aspx
    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="UploadFile.aspx.cs" Inherits="UploadFile" %>
    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    </head>
    <body>
    <form id="form1" runat="server">
    <div>
    <asp:FileUpload ID="FileUpload1" runat="server" />
    <asp:Button ID="Button1" runat="server" Text="Button" />
    </div>
    </form>
    </body>
    </html>
    测试页面UploadFile.aspx.cs
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    public partial class UploadFile : System.Web.UI.Page
    {
    protected void Page_Load(object sender, EventArgs e)
    {
    if (FileUpload1.FileContent != null)
    {
    FileUpload1.SaveAs(Server.MapPath("/Files/"+FileUpload1.FileName));
    }
    }
    }
    实际测试

    1.上传小于4M的文件

    选择2.7M的pdf文件上传
    上传提示成功
     2. 上传大于4M的文件
     选择上传4.3M的pdf文件


    上传后报黄页
    3. 修改web.config文件,设置可上传文件大小限制

    修改web.config,增大可上传文件的大小限制,增大执行时间限制

    <httpRuntime maxRequestLength="2048000" executionTimeout="600"/>

     重新选择刚才4.3M的pdf文件,重新上传
    上传成功
     
    4. 上传大于30M的的文件

     碰到这个问题的实际环境是我们使用了第三方的上传文件组件,通过js调用第三方的ActiveX控件上传文件,修改web.config后上传大于30M的文件的时候,报了如下错误
    查看windows系统日志,可以看到如下的日志错误,看到异常信息,我们可以猜测到是请求超长,但是我们设置了最大请求长度了啊,而且远远要大于30M。静下来想一想可能是IIS限制的,查询相关的IIS资料,发现果然是这样。

    异常消息: 超过了最大请求长度。
     System.Web.HttpRequest.GetEntireRawContent()
    System.Web.HttpRequest.GetMultipartContent()
    System.Web.HttpRequest.FillInFormCollection()
    System.Web.HttpRequest.EnsureForm()
    System.Web.HttpRequest.get_HasForm()
    System.Web.UI.Page.GetCollectionBasedOnMethod(Boolean dontReturnNull)
    System.Web.UI.Page.DeterminePostBackMode()
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

    5. 修改IIS的配置

    选中自己的站点,并双击“请求筛选”
    选择右侧的”编辑功能限制”
    在弹出的页面中,我们看到默认请求限制正是30M
    修改请求大小限制为合适的值即可,保存后重启站点即可。
                             

    总结

    1. Asp.NET作为微软的Web服务框架,其定义了web请求的大小限制和执行时间限制。同时其为上传文件提供了基础的框架,并为我们提供了UploadFile服务器控件,其最终也是通过Http将文件数据传输到服务器端,自然也受请求大小和执行时间的限制,只是一般的请求都打不到这个极限,往往是上传文件的时候才会触及这个阀值。

    2. IIS作为windows平台上承载ASP.NET的法定服务器,按照正常逻辑来说,其也能统一设置发送到自己这里请求的大小限制。同时由于IIS只将针对特定类型的文件的请求路由到ASP.NET进行处理,像js、css和图片等请求是不受ASP.NET中请求大小的限制的,这也从一个侧面说明有必要再IIS中添加控制。

    3. 请求的长度校验只有先通过IIS的限制后,才有可能路由到ASP.NET,只有最终通过ASP.NET的长度限制校验,才能正常的进行后续的管道处理步骤。
  • 请您注意

    ·自觉遵守:爱国、守法、自律、真实、文明的原则

    ·尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法规

    ·严禁发表危害国家安全,破坏民族团结、国家宗教政策和社会稳定,含侮辱、诽谤、教唆、淫秽等内容的作品

    ·承担一切因您的行为而直接或间接导致的民事或刑事法律责任

    ·您在编程中国社区新闻评论发表的作品,本网站有权在网站内保留、转载、引用或者删除

    ·参与本评论即表明您已经阅读并接受上述条款

  • 感谢本文作者
  • 作者头像
  • 昵称:牧羊人
  • 加入时间:2013/6/18 0:00:00
  • TA的签名
  • 这家伙很懒,虾米都没写
  • +进入TA的空间
  • 以下内容也很赞哦
分享按钮