最近做了个关于文件上传的功能,遇到了很多问题,经过研究查资料,最后一一解决,虽然不能说是最好的方法,但可以上传500M 的文件还是没有什么问题的.所以整理了下资料,贴出来希望大家可以研究,或者说是提供一些参考.
能够给大家一些启发.
1.2M以上的文件不能上传?
首先我们来说一下如何解决ASP.NET中的文件上传大小限制的问题,我们知道在默认情况下ASP.NET的文件上传大小限制为2M,一般情况下,我们可以采用更改WEB.Config文件来自定义最大文件大小,如下:
<httpRuntime executionTimeout="300" maxRequestLength="40960" useFullyQualifiedRedirectUrl="false"/>这样上传文件的最大值就变成了4M,但这样并不能让我们无限的扩大MaxRequestLength的值,因为ASP.NET会将全部文件载入内存后,再加以处理,服务器会出现内存不够的现象.经常会报OutOfMemoryException,网上查了很多资料都没有什么好的方法, 按照网上的方法全做了一遍感觉有些方法可以有些改善.如下:
在.NET Framework的配置上,修改machine.config配置文件中的配置节<processModel>的属性“memoryLimit”,这个属性的值默认为“60”,是一个百分比数据,我们需要按照服务器实际的内存数,再根据800M的上限来设置这个值,那么在达到这个阀值时IIS会自动回收进程.
当我们有一台很大内存的服务器时,“memoryLimit”这个值是需要进行适当的调整的。比如我们准备了一台chemas-microsoft-comSurprisefficeTongue Tiedmarttags" />Tongue Tiedt="on">4G内存的服务器,那么Tongue Tiedt="on">4G×60%=2.4G。但是,对于Win32操作系统,一个进程所能占用的所有内存空间只有Tongue Tiedt="on">2G。当ASP.NET进程占用的内存开始达到Tongue Tiedt="on">2G时,由于它并没有达到Tongue Tiedt="on">2.4G的“回收阈值”,所以IIS不会启动recycle进程操作,但是由于Win32的限制,实际上已经不能给这个进程分配更多的内存了,于是,OutOfMemoryException就很可能会被抛出了。为了避免这样的情况,我们就必须将“memoryLimit”适当调小,以让IIS更早的进行进程回收。
微软推荐的ASP.NET进程占用内存是不超过60%,并最好使计算出的实际值不超过Tongue Tiedt="on">800M。就是说,对于一台Tongue Tiedt="on">4G内存的服务器,最好将“memoryLimit”属性设置成“20”。设置一个适当的回收阈值,让IIS适时的进行进程回收,对于保证整个服务器的稳定运行,避免OutOfMemoryException是非常重要的。
好设好Machin.config 后有所改善,但是还是经常会OutOfMemoryException 的异常,怎么办.最后找了个微软官方的资料.提供了一些改善的方法地址如下http://support.microsoft.com/kb/916984。
其中最主要的方法如下:
在 IIS 6.0 中 ASP Web 应用程序使用异步写入 Http.sys 文件将数据传输到客户端计算机。 如果客户端计算机使用慢速连接,并且速度很慢检索请求的数据,数据排队 Web 服务器上的内存中。
应用此修补程序后,可以在内存中来配置进行排队的字节数。 如果您配置的限制达到之前在客户端计算机检索足够多的数据,以便队列的数据量小于配置的限制,,将暂停文件传输。
重要 此修复程序只会影响 ASP 应用程序。 此修补程序不会影响 Microsoft ASP.NET 应用程序。
要限制可以将排队 W3wp.exe 文件中的数据量,请按下列步骤操作:
- 应用本文中所述修补程序。
- 单击 开始 ,单击 运行 ,键入 regedit ,然后单击 确定 。
- 查找,并单击下面的注册表项:
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/ASP/Parameters
- 如果 VectorSendThrottleLimit 子项存在,转到步骤 7。 如果不存在 VectorSendThrottleLimit 子项,请转到步骤 5。
- 在 编辑 菜单上指向 新建 ,然后单击 DWORD 值 。
- 键入 VectorSendThrottleLimit ,然后按 Enter 键。
- 在右的窗格中右键单击 VectorSendThrottleLimit ,然后单击 修改 。
- 在在 数值数据 框中键入所需的值,,然后单击 确定 。
警告 如果将 VectorSendThrottleLimit 子项设置为一个 ASP 页发送到客户端的数据量小于值,IIS 会停止响应 (挂起)。 是例如如果您设置 VectorSendThrottleLimit 子项为 1000,传输超过 1000 个字节的任何 ASP 页面不在客户端浏览器中的 dispayed。 此外,IIS 线程处理该请求的被阻止,直到重新启动 IIS 服务中。
请注意 默认情况下, 此功能被禁用并且 VectorSendThrottleLimit 子项不存在。 在禁用此功能时则此子项的值为 0。