异步请求处理是ASP.NET 2.0中引入的高级特性,它依托IO Complete Port,对于提高IO密集型应用程 序的吞吐量非常重要(详见原理描述和性能测试)。但是目前ASP.NET MVC框架缺少异步Action功能,这 也就是老赵经常挂在嘴边的那个“目前ASP.NET MVC所缺少的非常重要的功能”。在TechED 2008 China的 Session中我曾经给出过一个所谓的“解决方案”,但是它复杂性之高使那个解决方案有太多限制。为了 弥补TechED上的遗憾,以及准备.NET开发大会上的ASP.NET MVC最佳实践的Session,我在春节休假期间仔 细思考了一下这方面的问题,得出了一个相对不错的扩展:完整,方便,并且非常轻巧——核心逻辑代码 只有200行左右,这意味着绝大部分功能将会委托给框架中现成的内容,确保了扩展的稳定,高效并且拥 有较好的向后兼容性。
值得一提的是,我在1/26号便基于ASP.NET MVC的Beta版本写出了这个扩展的第一个版本,而在不久之 后微软发布了ASP.NET MVC RC。我在移植解决方案的过程中发现ASP.NET MVC RC在框架设计上进行了较大 的改进,这使得我在构建扩展时的策略发生了些许变化。令人欣喜的是,RC版本的这些变化对于构建一个 扩展,尤其是现在这种“低端”级别的扩展变得更加容易。ASP.NET MVC框架实现了它“到处可扩展”的 承诺。
那么我们现在就来详细分析一下这个扩展的实现方式。
请求处理方式的改变
在制定基本改造策略之前,我们需要了解ASP.NET MVC框架目前的架构及请求处理流程。如下:
在应用程序启动时(此时还没有接受任何请求),将针对MVC请求的Route策略注册至ASP.NET Routing 模块。此时每个Route策略(即Route对象)中的RouteHandler属性为ASP.NET MVC框架中的 MvcRouteHandler。
当ASP.NET Routing模块接收到一个匹配某个Route策略的HTTP请求时,将会调用该Route对象中 RouteHandler对象的GetHttpHandler以获取一个HttpHandler,并交由ASP.NET执行。MvcRouteHandler永 远将返回一个MvcHandler对象。
MvcHandler在执行时,将取出RouteData中的controller值,并以此构建一个实现了IController接口 的控制器对象,并调用IController接口的Execute方法执行该控制器。
对于一个ASP.NET MVC应用程序来说,大部分控制器将会继承System.Web.Mvc.Controller类型。 Controller类将会从RouteData获取action值,并交给实现IActionInvoker接口的对象来执行一个Action 。
……