Asp.net大檔案上傳(一)
吳劍 2010-4-19
轉載請註明出處:http://www.cnblogs.com/wu-jian/
1. 前言
本文從基礎知識開始系統的描述了.Net大檔案上傳解決方案,希望給有需要的人提供協助,同時介紹了IIS、Http管道、Asp.Net管道一些相對較底層知識,個人能力有限,不足之處請及時指正。
2. HTTP管道
2.1. ISAPI
當使用者在瀏覽器中鍵入一個URL、點擊一個超連結或提交一個HTML表單,在伺服器端,IIS5或IIS6將會收到這個請求,並根據請求URL的副檔名不同交由不同的ISAPI擴充來處理,如所示:
ISAPI是底層非託管的win32 API,它定義的介面非常的單一併且效能最優。開發人員和第三方廠商可以使用這些介面深入到IIS裡。由於ISAPI是非常低層的,所以不太適合使用它構建應用級的程式。ISAPI趨向於被當作橋介面使用,用於給高層次的工具提供應用服務類型的功能,例如運行於IIS的Apache、Tomcat就是構建於ISAPI之上。ISAPI是個非常好的工具,它給高層次的應用程式提供了高效能垂直提供者,這使得那些高層次的應用程式需要的資訊可以從ISAPI提供的資訊中提煉。在ASP和ASP.NET裡,引擎可以提煉ISAPI介面提供的表單裡的對象如:Request和Response,這些對象可以從ISAPI請求的資訊中讀取它們各自的內容。可以說,ISAPI是自訂Web請求處理中第一個並且具有最高效能的IIS進入點。
2.2. ISAPI擴充
作為約定,ISAPI支援ISAPI擴充(extensions)和ISAPI過濾(filters)。擴充是請求處理介面,提供了跟Web Server輸入和輸出相關的邏輯處理。從本質上來說,它是一個事務介面,ASP和ASP.NET都被看作ISAPI擴充的實現。ISAPI是鉤子介面,它允許你查看進入IIS的每一個請求並且可以修改請求的內容(包括輸入和輸出)。
ASP.NET的ISAPI擴充為aspnet_isapi.dll,如所示:
2.3. IIS5與IIS6
當一個aspx請求到達IIS時,會檢查指令碼映射,然後把請求路由到aspnet_isapi.dll。接下來這個DLL檔案的操作是什麼呢?在IIS5和IIS6裡,這個請求又是如何到達ASP.NET運行時的呢?它們兩者的處理方式有沒有重大變化呢?
在IIS5中:
1、用戶端的請求進入IIS,IIS根據請求的URL試圖找到一個擴充映射,當發現URL是一個.aspx時,則將請求交由aspnet_isapi.dll
2、ISAPI DLL再通過一些已命名的管道與ASP.NET工作者進程串連
3、ASP.NET把請求傳遞給一個指定的AppDomain
4、在AppDomain中開始走ASP.NET管道流程,這個流程經過了一系列的步驟,最終結果是將請求傳遞給服務終點(Endpoint)----我們編寫的.aspx.cs類,這個類從Page派生,並實現IHttpHandler介面
在IIS6中:
IIS不再直接寄宿像ISAPI擴充的任何外部可執行代碼。代替的是,IIS總會保持一個單獨的背景工作處理序:應用程式集區。所有的處理都發生在這個進程裡,包括ISAPI dll的執行。對於IIS6而言,應用程式集區是一個重大的改進,因為它們允許以更小的粒度控制一個指定進程的執行。你可以為每一個虛擬目錄或者整個Web網站配置應用程式集區,這可以使你很容易的把每一個應用程式隔離到各自的進程裡,這樣就可以把它與運行在同一台機器上其他程式完全隔離。從Web處理的角度看,如果一個進程死掉,至少它不會影響到其它的進程。
下一篇:Asp.net大檔案上傳(二)