我研究这个问题已经很长时间了,ASPUpload的组件以及其它几个组件都使用过,多多少少对这些组件的工作原理有些了解,对于其它一些问题的讨论也都遇到过。前几个星期开发的WebbUpload2.0经过一段时间的测试后,发现它完全是一个超级大BUG,所以放弃发布它了。(不想害人了。)
先收集一些网络上关于这个问题的一些内容:
http://blog.joycode.com/saucer/archive/2004/03/16/16225.aspx
http://www.cnblogs.com/bestcomy/archive/2004/06/09/14267.aspx BestCompy的上传组件
http://www.cnblogs.com/lion.net/archive/2004/07/14/24294.aspx lion 的上传组件
http://www.voidland.com/blog/article.asp?id=22
一般情况下,用ASP,net上传大文件会遇到以下几个问题:
1、无法Catch的页面找不到错误,一般会是DNS错误,这里有一个小讨论。
http://koffer.cnblogs.com/archive/2005/04/21/142799.aspx
2、还会遇到这样的几个问题:
Action cancled,我在测试WebbUpload2.0的时候遇到多次,跟踪的LOG发现是用户取消了上传。然而这是不可能的,唯一的可能就是IIS自动取消了用户上传。
还有一个错误就是:The page cannot be displayed
这个错误我也遇到过N次。而且为此郁闷了好几天。
总结一下问题:
首先要明确,在网络环境不是很坏的情况下,我们是可以在ASP.net下上传超级大文件的。BestCompy的组件就是一个很好的例子,然而对于出现的问题,我们要明确原因,然后再来处理。
1、Action canceled问题,
出现这一问题其实只有一种情况,就是在实现HttpMoudule的时候,出现程序错误。这时候IIS直接返回Action canceled,而不再生成逻辑页面。我在调试程序的时候发现,不仅在HttpModule里出现错误时,页面直接Cancel掉,而且在它的子函数里出现任何错误都一样!
有一个解决方法可以显示的让页面报误,就是大块的Catch,把整个Module Catch住,然后抛出自己的异常,这样会在进度条显示页面上看到这个错误。(不知道为什么会是在进度条页面上)。而上传页面上只有一个action canceled错误,但在访问其它页面前,它会快速的显示一下自己定义的错误。
因此解决这一问题的唯一方法就是:确保你的上传模块不能有任何的错误,否则IIS就直接Cancel掉了。注意:是在传超级大文件时(>100MB)。其它的不与讨论。
还有个错误就是The page cannot be displayed,报DNS错误。这个错误我一直不知道为什么,后来跟踪IIS内存,发现上传过程中,消耗过大时,IIS的进程会消失一次!不用说,就在这消失的一瞬间,页面找不到了(很正常不是吗?)。在MSDN上找到了相关的说明:
http://support.microsoft.com/kb/893227
这给我们的程序设计出了个大难题,我的WebbUpload2.0失败之处就是内存占用太大了,在上传1G的文件时,内存直线上升,到300MB的时候,IIS就闪了一次,于是出现页面找不到。跟踪发现在算法只一味的追求速度,而没有管内存。这是一个失败的做法!也让自己清醒了一次。知道错误以后,就可以自己解决问题。