当 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 项目体系结构