我們在上傳大文件時都遇到過這樣或那樣的問題。設置很大的maxRequestLength值並不能完全解決問題,因為ASP.Net會block直到把整個文件載入內存後,再加以處理。實際上,如果文件很大的話,我們經常會見到Internet Explorer顯示 "The page cannot be displayed - Cannot find server or DNS Error",好像是怎麼也catch不了這個錯誤。為什麼?因為這是個clIEnt side錯誤,server side端的Application_Error是處理不到的,可以參考這個帖子研究一下產生這個錯誤的機理。
handling server error when upload file too large
解決的方法是利用隱含的HttpWorkerRequest,用它的GetPreloadedEntityBody 和 ReadEntityBody方法從IIS為ASP.Net建立的pipe裡分塊讀取數據
IServiceProvider provider = (IServiceProvider) HttpContext.Current;
HttpWorkerRequest wr = (HttpWorkerRequest) provider.GetService(typeof(HttpWorkerRequest));
byte[] bs = wr.GetPreloadedEntityBody();
....
if (!wr.IsEntireEntityBodyIsPreloaded())
{
int n = 1024;
byte[] bs2 = new byte[n];
while (wr.ReadEntityBody(bs2,n) >0)
{
.....
}
}
Chris Hynes為我們提供了這樣的一個方案(用HttpModule),該方案除了允許你上傳大文件外,還能實時顯示上傳進度:
ASP.Net Upload Magic Part 2
這裡有他講座的PPT文件:
Uploading with ASP.Net (part 1)
Uploading with ASP.Net (part 2)