ASP.NET是一個非常強大的構建Web應用的平台,它提供了極大的靈活性和能力以致於可以用它來構建所有類型的Web應用。絕大多數的人只熟悉高層的框架如WebForms和WebServices-這些都在ASP.NET層次結構在最高層。在這篇文章中我將會討論ASP.NET的底層機制並解釋請求(request)是怎麼從Web服務器傳送到ASP.NET運行時然後如何通過ASP.NET管道來處理請求。
對我而言了解平台的內幕通常會帶來滿足感和舒適感,深入了解也能幫助我寫出更好的應用。知道可以使用哪些工具以及他們是怎樣作為整個復雜框架的一部分來互相配合的可以更容易地找出最好的解決方案,更重要的是可以在出現問題時更好的解決它們。這篇文章的目標是從系統級別了解ASP.NET並幫助理解請求(request)是如何在ASP.NET的處理管道中流轉的。同樣,我們會了解核心引擎和Web請求如何在那裡結束。這些信息大部分並不是你在日常工作時必須了解的,但是它對於理解ASP.NET架構如何把請求路由到你的代碼(通常是非常高層的)中是非常有益的。
不管怎麼樣,ASP.NET從更低的層次上提供了更多的靈活性。HTTP運行時和請求管道在構建WebForms和WebServices上提供了同樣的能力-它們事實上都是建立在。NET托管代碼上的。而且所有這些同樣的功能對你也是可用的,你可用決定你是否需要建立一個比WebForms稍低一點層次的定制的平台。
WebForms顯然是最簡單的構建絕大多數Web接口的方法,不過如果你是在建立自定義的內容處理器(handler),或者有在處理輸入輸出內容上有特殊的要求,或者你需要為另外的應用建立一個定制的應用程序服務接口,使用這些更低級的處理器(handler)或者模塊(module)能提供更好的性能並能對實際請求處理提供更多的控制。在WebForms和WebServices這些高層實現提供它們那些能力的同時,它們也對請求增加了一些額外負擔,這些都是在更底層可以避免的。
ASP.NET是什麼
讓我們以一個簡單的定義開始:什麼是ASP.NET?我喜歡這樣定義ASP.NET:
ASP.NET是一個復雜的使用托管代碼來從頭到尾處理Web請求的引擎。
它並不只是WebForms和WebServies…
ASP.NET是一個請求處理引擎。它接收一個發送過來的請求,把它傳給內部的管道直到終點,作為一個開發人員的你可以在這裡附加一些代碼來處理請求。這個引擎是和HTTP/Web服務器完全分隔的。事實上,HTTP運行時是一個組件,使你可以擺脫IIS或者任何其他的服務器程序,將你自己的程序寄宿在內。例如,你可以將ASP.NET運行時寄宿在一個Windows form程序中(查看http://www.west-wind.com/presentations/aspnetruntime/aspnetruntime.asp可以得到更加詳細的信息)
運行時提供了一個復雜但同時非常優雅的在管道中路由請求的機制。其中有很多相關的對象,大多數都是可擴展的(通過繼承或者事件接口),在幾乎所有的處理流程上都是如此。所以這個框架具有高度可擴展性。通過這個機制,掛接到非常底層的接口(比如緩存,認證和授權)都變得可能了。你甚至可以在預處理或者處理後過濾內容,也可以簡單的將符合特殊標記的請求直接路由你的代碼或者另一個URL上。存在著許多不同的方法來完成同一件事,但是所有這些方法都是可以簡單直接地實現的,同時還提供了靈活性,可以得到最好的性能和開發的簡單性。
整個ASP.NET引擎是完全建立在托管代碼上的,所有的擴展功能也是通過托管代碼擴展來提供的
整個ASP.NET引擎是完全建立在托管代碼上的,所有的擴展功能也是通過托管代碼擴展來提供的。這是對。NET框架具有構建復雜而且高效的框架的能力的最好的證明。ASP.NET最令人印象深刻的地方是深思熟慮的設計,使得框架非常的容易使用,又能提供掛接到請求處理的幾乎所有部分的能力。
通過ASP.NET你可以從事從前屬於ISAPI擴展和IIS過濾器領域的任務-有一些限制,但是比起ASP來說是好多了。ISAPI是一個底層的Win32風格的API,有著非常粗劣的接口而且難以用來開發復雜的程序。因為ISAPI非常底層,所以它非常的快,但是對於應用級的開發者來說是十分難以管理的。所以,ISAPI通常用來提供橋接的接口,來對其他應用或者平台進行轉交。但是這並不意味者ISAPI將消亡。事實上,ASP.NET在微軟的平台上就是通過ISAPI擴展來和IIS進行交互的,這個擴展寄宿著。NET運行時和ASP.NET運行時。ISAPI提供了核心的接口,ASP.NET使用非托管的ISAPI代碼通過這個接口來從Web服務器獲取請求,並發送響應回客戶端。ISAPI提供的內容可以通過通用對象(例如HttpRequest和HttpResponse)來獲取,這些對象通過一個定義良好並有很好訪問性的接口來暴露非托管數據。