三、ASP.NET上传文件遇到的问题
我们在用ASP.NET上传大文件时都遇到过这样或那样的问题。设置很大的maxRequestLength值并不能完全解决问题,因为ASP.NET会block直到把整个文件载入内存后,再加以处理。实际上,如果文件很大的话,我们经常会见到Internet Explorer显示 "The page cannot be displayed - Cannot find server or DNS Error",好像是怎么也catch不了这个错误。为什么?因为这是个client side错误,server side端的Application_Error是处理不到的。
四、ASP.NET大文件上传解决方案
解决的方法是利用隐含的HttpWorkerRequest,用它的GetPreloadedEntityBody 和 ReadEntityBody方法从IIS为ASP.NET建立的pipe里分块读取数据。Chris Hynes为我们提供了这样的一个方案(用HttpModule),该方案除了允许你上传大文件外,还能实时显示上传进度。
Lion.Web.UpLoadModule和AspnetUpload 两个.NET组件都是利用的这个方案。
实际上,如果文件很大的话,我们经常会见到Internet Explorer显示 "The page cannot be displayed - Cannot find server or DNS Error",好像是怎么也catch不了这个错误。为什么?因为这是个client side错误,server side端的Application_Error是处理不到的。
我试了好多次,发现这个错误确实是在服务器端,这是我的证明:
11/7/2005 11:07:13 AM aa8b180d-a91e-4734-938f-00c066b4993b:aa8b180d-a91e-4734-938f-00c066b4993b.doc
11/7/2005 11:08:07 AM Start Upload.......
11/7/2005 11:08:11 AM HttpModule error.....
11/7/2005 11:09:31 AM Start Upload.......
11/7/2005 11:09:44 AM HttpModule error.....
11/7/2005 11:10:43 AM Start Upload.......
11/7/2005 11:10:46 AM 55007:49152
11/7/2005 11:10:46 AM -----------------------------7d531c2e1705ac
其中的两次,都是因为我上传了大的文件,而使程序出现了错误。而这个错误不是用try和catch块来处理的,而是在
private void WebbUpload_Error(object sender, EventArgs e)
{
#region function WebbUpload_Error
WebbTextTrace.TraceMsg("HttpModule error.....");
#endregion
this.Dispose();
}
也就是说,当我们上传很大的文件的时候,服务器它会很快的检测文件的大小,然后返回错误。事实也证明,每次我都只能上传一半的文件。出现这个问题是怎么回事呢?