ASP.NET大文件上传设置maxRequestLength无效的情况

1.IIS6

更改win2003的IIS 6.0对asp教程的上传文件大小为200k限制,aspx的上传程序没有影响。在IIS6.0中,默认设置是特别严格和安全的,最大只能传送 204,800 个字节,这样可以最大限度地减少因以前太宽松的超时和限制而造成的攻击。IIS 6 出于安全考虑, 默认最大请求是200K(也即最大提交数据限额为200KByte,204800Byte)。(在 IIS 6.0 之前的版本中无此限制)

  解决办法一:

    新建一个文本文件,内容如下:

    '----------------------------------------------------

    set providerObj=GetObject("winmgmts:/root/MicrosoftIISv2")

    set vdirObj=providerObj.get("IIsWebVirtualDirSetting='W3SVC/1/ROOT'")

    WScript.Echo "Before: " & vdirObj.AspMaxRequestEntityAllowed

    vdirObj.AspMaxRequestEntityAllowed=51200000

    vdirObj.Put_()

    WScript.Echo "Now: " & vdirObj.AspMaxRequestEntityAllowed

    '----------------------------------------------------


    然后保存为.vbs文件,如:vf.vbs

    然后在命令行模式下,执行 cscript 文件路径及文件名,如:

    cscript d:vf.vbs

  这样ASP上传大小就更改为了上面设置的:51200000字节 (50兆)

 ASP.NET大文件上传设置maxRequestLength无效的情况_第1张图片

2.

我自己的项目经验,当在普通的aspx 页面中上传文件时,在web.config中加入 httpRuntime 节点是可以解决问题的,但是当上传文件的逻辑写在

ashx 中时,仅仅在web.config中配置HttpRuntime,还是会报出超过了最大请求长度的错误。

在通常(不局限于此)在上传文件大于ASP.NET默认的4M 或 Web.config 的的配置时会抛出此异常;

Web.config 配置:

< configuration > < system.web > < httpRuntime  maxRequestLength ="4096" executionTimeout ="3600" /> system.web > < configuration >

如果光是调整Web.config的 maxRequestLength 是治标不治本的。

今天研究了下在网上找到一个方法,代码大致如下:

Global.asax.cs

需要多引入命名空间

Using System.Web.Configuration;

void Application_BeginRequest(object sender, EventArgs e)
        {
            //本代码的功能是检查页面请求的大小,如果超过了配置文件maxRequestLength的设定值,就提示用户超过了所允许的文件大小。

            //从配置文件里得到配置的允许上传的文件大小
            HttpRuntimeSection runTime = (HttpRuntimeSection)WebConfigurationManager.GetSection("system.web/httpRuntime");

            //maxRequestLength 为整个页面的大小,不仅仅是上传文件的大小,所以扣除 100KB 的大小,
            //maxRequestLength单位为KB
            int maxRequestLength = (runTime.MaxRequestLength) * 1024;

            //当前请求上下文的HttpApplication实例
            //HttpContext context = ((HttpApplication)sender).Context;

            //判断请求的内容长度是否超过了设置的字节数
            if (Request.ContentLength > maxRequestLength)
            {
                #region 不理解这些代码存在的意义
                /*
                //得到服务对象
                IServiceProvider provider = (IServiceProvider)context;
                HttpWorkerRequest workerRequest = (HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest));

                //检查请求是否包含正文数据
                if (workerRequest.HasEntityBody())
                {
                    //请求正文数据的长度
                    int requestLength = workerRequest.GetTotalEntityBodyLength();
                    //得到加载的初始字节数
                    int initialBytes = 0;
                    if (workerRequest.GetPreloadedEntityBody() != null)
                        initialBytes = workerRequest.GetPreloadedEntityBody().Length;

                    //检查是否所有请求数据可用
                    if (!workerRequest.IsEntireEntityBodyIsPreloaded())
                    {
                        byte[] buffer = new byte[512000];
                        //设置要接收的字节数为初始字节数
                        int receivedBytes = initialBytes;
                        //读取数据,并把所有读取的字节数加起来,判断总的大小
                        while (requestLength - receivedBytes >= initialBytes)
                        {
                            //读取下一块字节
                            initialBytes = workerRequest.ReadEntityBody(buffer, buffer.Length);
                            //更新接收到的字节数
                            receivedBytes += initialBytes;
                        }
                        initialBytes = workerRequest.ReadEntityBody(buffer, requestLength - receivedBytes);
                    }
                }
                */
                #endregion
                //注意这里可以跳转,可以直接终止;在VS里调试时候得不到想要的结果,通过IIS才能得到想要的结果;FW4.0经典或集成都没问题
                Response.Write("请求大小" + Request.ContentLength);
                Response.End();
            }
        }

 


你可能感兴趣的:(ASP.NET)