當 ASP.NET 首次在 2002 年發布時,時代有所不同。 那時,Internet 仍處於起步階段,大約有 5.69 億 用戶,每個用戶平均每天訪問 Internet 的時間為 46 分鐘,大約有 3 百萬個網站。 僅僅在 10 年之後,相 同的測量指標揭示,大約有 22.7 億個 Internet 用戶,每個用戶平均每天訪問 Internet 的時間為 4 小時 ,大約有 5.55 億個網站(請參閱 bit.ly/MY7GzO)。
很顯然,這種增長相應地刺激了對應用程序開發者的需求變化,具體表現在生成和運行 Web 應用程序的基 礎框架、工具和運行時等方面。 現代 Web 應用程序必須能夠快速地發展,充分利用許多不同的組件和框架。 它們的占用空間必須很小,這樣才能在雲的大型運行時環境中有效地運行。
確保 ASP.NET 能夠滿足這些當前需求和未來需求正是 Katana 項目的主要目標。 Katana 簡介
Katana 項目實際可以追溯到 Microsoft 外部一個名為 Open Web Interface for .NET (OWIN) 的開 放源代碼項目。OWIN 是一種定義 Web 服務器和應用程序組件之間的交互的規范(請參閱 owin.org)。 由於 這一規范的目的是發展一個廣闊且充滿活力的、基於 Microsoft .NET Framework 的 Web 服務器和應用程序 組件生態系統,因此它可以將服務器與應用程序之間的交互減少到一小部分類型和單個函數簽名,這個函數簽 名被稱為應用程序委托(即 AppFunc):
using AppFunc = Func<IDictionary<string, object>, Task>;
基於 OWIN 的應用程序中的每個組件都向服務器提供應用程序委托。 然後,這些組件鏈接成一個管道,基 於 OWIN 的服務器將會向該管道推送請求。 為了更有效地使用資源,管道中的所有組件都應該是異步的,這 體現在返回 Task 對象的應用程序委托中。
包括應用程序狀態、請求狀態和服務器狀態等在內的所有狀態都保存在應用程序委托上指定的 IDictionary<string, object> 對象中。 這種數據結構稱為環境字典,隨著請求通過管道時會從一個 組件傳遞到另一個組件。 雖然任何鍵/值數據都可以插入到環境字典中,但 OWIN 規范為某些 HTTP 核心元素 定義了鍵,如圖 1 中所示。
圖 1 HTTP 請求的必需環境字典鍵
定義一組基本的環境字典鍵/值對,使得許多不同的框架和組件作者可以在一個 OWIN 管道中進行互操作, 而不必強制實施對特定 .NET 對象模型的協議,例如針對 ASP.NET MVC 中的 HttpContextBase 或 ASP.NET Web API 中的 HttpRequestMessage/HttpResponseMessage 的協議。
應用程序委托和環境字典這兩個元素構成了 OWIN 規范。Katana 項目是 Microsoft 創建和推出的基於 OWIN 的組件和框架集合。
Katana 組件可以通過體系結構堆棧查看,如圖 2 中所示。
圖 2 Katana 項目體系結構