知识大全 为ASP.NET MVC扩展异步Action功能(上)

Posted 框架

篇首语:我们不会把常识僵化并使它变成信条。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 为ASP.NET MVC扩展异步Action功能(上)相关的知识,希望对你有一定的参考价值。

为ASP.NET MVC扩展异步Action功能(上)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  本文将分为上下两部分 您也可以从《Extend ASP NET MVC for Asynchronous Action》获得全部内容

  异步请求处理是ASP NET 中引入的高级特性 它依托IO Complete Port 对于提高IO密集型应用程序的吞吐量非常重要(详见原理描述和性能测试) 但是目前ASP NET MVC框架缺少异步Action功能 这也就是老赵经常挂在嘴边的那个 目前ASP NET MVC所缺少的非常重要的功能 在TechED China的Session中我曾经给出过一个所谓的 解决方案 但是它复杂性之高使那个解决方案有太多限制 为了弥补TechED上的遗憾 以及准备 NET开发大会上的ASP NET MVC最佳实践的Session 我在春节休假期间仔细思考了一下这方面的问题 得出了一个相对不错的扩展 完整 方便 并且非常轻巧——核心逻辑代码只有 行左右 这意味着绝大部分功能将会委托给框架中现成的内容 确保了扩展的稳定 高效并且拥有较好的向后兼容性

  值得一提的是 我在 / 号便基于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 ……   如果我们要将这个流程改造成异步处理 那么就要让它符合ASP NET架构中的异步处理方式 ASP NET架构对于异步请求的处理可以体现在好几种方式上 例如异步页面 异步Http Module等 而最适合目前场合的做法自然是异步Http Handler 为实现一个异步Handler 我们需要让处理请求的Handler实现IHttpAsyncHandler接口 而不是传统的IHttpHandler接口 IHttpAsyncHandler接口中的BeginProcessRequest和EndProcessRequest两个方法构成了 NET中的APM(Aynchronous Programming Model 异步编程模型)模式 可以使用 二段式 的异步调用来处理一个HTTP请求

  您应该已经发现 如果我们要支持异步Action 就必须根据当前的请求信息来确认究竟是执行一个IHttpHandler对象还是IHttpAsyncHandler对象 而在ASP NET MVC框架在默认情况下是在Http Handler(即MvcHandler对象)内部进行控制器的检查 构造和调用 这为时已晚 我们必须讲这些逻辑提前到Routing过程中才行 幸运的是 ASP NET Routing所支持的IRouteHandler就像是ASP NET中的IHttpHandlerFactory 可以根据情况生成不同的Handler来执行 因此 我们只要构建一个新的IRouteHandler类型即可

  于是就诞生了AsyncMvcRouteHandler——可以想象的出 其中的部分代码与框架中的MvcHandler相同 因为在一定程度上我们的确只是把原本在MvcHandler里做的事情给提前了

  public class AsyncMvcRouteHandler : IRouteHandler    public IHttpHandler GetHttpHandler(RequestContext requestContext)            string controllerName = requestContext RouteData GetRequiredString( controller );

  var factory = ControllerBuilder Current GetControllerFactory();        var controller = factory CreateController(requestContext controllerName);        if (controller == null)                    throw new InvalidOperationException( );       

  var coreController = controller as Controller;        if (coreController == null)                    return new SyncMvcHandler(controller factory requestContext);                else       

  string actionName = requestContext RouteData GetRequiredString( action );            return IsAsyncAction(coreController actionName requestContext)                 (IHttpHandler)new AsyncMvcHandler(coreController factory requestContext) :                (IHttpHandler)new SyncMvcHandler(controller factory requestContext);           

  internal static bool IsAsyncAction(        Controller controller string actionName RequestContext requestContext)               

  在GetHttpHandler方法中 我们先从RouteData的controller字段中获取控制器的名字 并通过注册在ControllerBuilder上的Factory来创建一个实现了IController接口的控制器对象 由于我们需要使用Controller类中包含的ActionInvoker来辅助检测Action的异步需求 因此我们会设法将其转化为Controller类型 如果转换成功 就会取出RouteData中的action字段的值 并通过IsAsyncAction方法来确认当前Action是否应该异步执行 如果是 则返回一个实现了IHttpAsyncHandler的AsyncMvcHandler对象 否则就返回一个实现IHttpHandler的SyncMvcHandler对象

  至于AsyncMvcRouteHandler的使用 只需在MapRoute时将Route Handler重新设置一下即可

  public static void RegisterRoutes(RouteCollection routes)    routes IgnoreRoute( resource axd/*pathInfo );

  routes MapRoute(        Default                                               // Route name        controller/action/id                            // URL with parameters        new controller = Home action = Index id =   // Parameter defaults    ) RouteHandler = new AsyncMvcRouteHandler();

cha138/Article/program/net/201311/13946

相关参考

知识大全 ASP.NET MVC 4框架揭秘:Action的执行(1)[2]

ASP.NETMVC4框架揭秘:Action的执行(1)[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来

知识大全 ASP.NET MVC 4框架揭秘:Action的执行(1)[1]

ASP.NETMVC4框架揭秘:Action的执行(1)[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来

知识大全 13个不可不知的ASP.NET MVC扩展点

13个不可不知的ASP.NETMVC扩展点  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  ASP

知识大全 ASP.NET 2.0 中的异步页功能应用

ASP.NET2.0中的异步页功能应用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!ASPNET提

知识大全 ASP.NET MVC自定义过滤属性实现log功能

ASP.NETMVC自定义过滤属性实现log功能  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 ASP.NET MVC 2.0之MVC框架简介

ASP.NETMVC2.0之MVC框架简介  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Web

知识大全 ASP.NET MVC

Web开发模式的颠覆者:ASP.NETMVC  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  年月

知识大全 ASP.NET MVC: DictionaryValueProvider

ASP.NETMVC:DictionaryValueProvider  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快

知识大全 ASP.NET 的MVC结构之AJAX

ASP.NET的MVC结构之AJAX  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  ASPNET

知识大全 自己动手实现Asp.net的MVC框架

自己动手实现Asp.net的MVC框架  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  了解JAV