1. ActionInvoker 的执行:

  在MVC 中  包括Model绑定与验证在内的整个Action的执行是通过一个名为ActionInvoker的组件来完成的。 它同样具有 同步/异步两个版本。

分别实现了接口 IActionInvoker /IAsyncActionInvoker。

ASP.NET MVC 中真正用于Action方法同步和异步执行ActionInvoker 类型分别是 ContorllerActionInvoker /AsyncContollerActionInvoker.

AsyncContollerActionInvoker 是 ContorllerActionInvoker  的子类

也就是说 当Action 没有指定  实现 IActionInvoker /IAsyncActionInvoker 接口的时候  它默认是 执行AsyncContollerActionInvoker 的.

我们来看下面的代码片段:

我们通过 Ninject 对 SyncActionInvoker 和 AsyncActionInvoker 进行接口的映射,然后创建一个 ActionInvoker

其返回的结果分别是  各自的实例对象 AsyncContollerActionInvoker SyncActionInvoker  AsyncActionInvoker (这中间有一个前提需要进行 缓冲的清除 )

   public ActionResult Index()
{ return View(this.GetActionInvokers().ToArray());
} public IEnumerable<IActionInvoker> GetActionInvokers()
{
//Current 代表的是当前DependencyResolver。
NinjectDependencyResolver dependencyResolver = (NinjectDependencyResolver)DependencyResolver.Current;
//1. 默认创建的ActionInvoker
yield return this.CreateActionInvoker(); //2. 为Dependency注册针对IActionInvoker的类型映射
dependencyResolver.Register<IActionInvoker, SyncActionInvoker>();
yield return this.CreateActionInvoker(); //3. 为Dependency注册针对IAsyncActionInvoker的类型映射
dependencyResolver.Register<IAsyncActionInvoker, AsyncActionInvoker>();
yield return this.CreateActionInvoker();
}

注意: 创建 ActionInvoker 的3个步骤

   1.) 在创建 CreateActionInvoker 的时候 如果返回 不为null 则将其默认为ActionInvoker, 也就是如上代码,(清除ActionInvoker缓存后) 它返回                             AsyncContollerActionInvoker, 如果 返回null  则进入 下一步骤。

  2.) 创建 IActionInvoker  规则同上

  3.)创建 IAsyncActionInvoker 规则同上

2. ControllerDescriptor 的同步/异步

  如果Controller使用ControllerActionInvoker ,它所有的Action总是以同步方式执行。

如果 Controller使用AsyncControllerActionInvoker 作为ActionInvoker时,却并不意味这总是异步方式。

通过两个描述对象 ControllerDescriptor  和 ActionDescriptor

在默认情况下 ReflectedControllerDescriptor  是通过ControllerActionInvoker 来创建的。

ReflectedAsyncControllerActionInvoker 是通过AsyncControllerActionInvoker  来创建的。

看如下代码 他们返回 返回的值 分别是对象类型的  ReflectedControllerDescriptor   和 ReflectedAsyncControllerActionInvoker 。

    public class SyncActionInvoker : ControllerActionInvoker
{
public new ControllerDescriptor GetControllerDescriptor(ControllerContext controllerContext)
{
return base.GetControllerDescriptor(controllerContext);
}
} public class AsyncActionInvoker : AsyncControllerActionInvoker
{
public new ControllerDescriptor GetControllerDescriptor(
ControllerContext controllerContext)
{
return base.GetControllerDescriptor(controllerContext);
}
}

3.ActionDescriptor的执行。

Action 方法可以采用同步和异步执行方式,异步Action对应的ActionDescriptor 直接或者间接继承自抽象类AsyncActionDescriptor,

AsyncActionDescriptor 又是抽象类ActionDescriptor的子类。

同步和异步的 Action 分别 调用 Execute 和  BeginExecute/EndExecute方法来完成

AsyncActionDescriptor 重写了Execute 会抛出异常,所以 AsyncActionDescriptor对象只能采用异步执行。

同步Action 通过ReflectedControllerDescriptor 对象描述。

异步Action 通过ReflectedAsyncControllerDescriptor  对象描述。

返回Task的异步Action 则通过TaskAsyncControllerDescriptor 对象描述。

MVC4 Action 方法的执行的更多相关文章

  1. Asp.net mvc 中Action 方法的执行(三)

    [toc] 前面介绍了 Action 方法执行过程中的一些主要的组件以及方法执行过程中需要的参数的源数据的提供以及参数的绑定,那些都可以看作是 Action 方法执行前的一些必要的准备工作,接下来便将 ...

  2. Asp.net mvc 中Action 方法的执行(一)

    [toc] 在 Aps.net mvc 应用中对请求的处理最终都是转换为对某个 Controller 中的某个 Action 方法的调用,因此,要对一个请求进行处理,第一步,需要根据请求解析出对应的 ...

  3. Asp.net mvc 中Action 方法的执行(二)

    [toc] 前面介绍了 Action 执行过程中的几个基本的组件,这里介绍 Action 方法的参数绑定. 数据来源 为 Action 方法提供参数绑定的原始数据来源于当前的 Http 请求,可能包含 ...

  4. [yii2] 实现所有action方法之前执行一段代码或者方法

    我做的是在执行任何方法之前,验证用户登陆状态! 其实就是在controller中写beforeaction()方法, 然后我的方案就是做一个基类,然后让你所有控制器继承你的基类, 如果控制器的基类用_ ...

  5. 如何让ASP.NET Web API的Action方法在希望的Culture下执行

    在今天编辑推荐的<Hello Web API系列教程--Web API与国际化>一文中,作者通过自定义的HttpMessageHandler的方式根据请求的Accep-Language报头 ...

  6. MVC源码分析 - Action/Result 过滤器执行时机

    前面 的篇章, 解析了Action方法的查找, 以及 Authorize, Action, Result, Error 过滤器的加载时机. 也花了两篇去看授权和错误过滤器的使用. 但是对于 Actio ...

  7. Web APi之控制器选择Action方法过程(九)

    前言 前面我们叙述了关于控制器创建的详细过程,在前面完成了对控制器的激活之后,就是根据控制器信息来查找匹配的Action方法,这就是本节要讲的内容.当请求过来时首先经过宿主处理管道然后进入Web AP ...

  8. C# 给某个方法设定执行超时时间 C#如何控制方法的执行时间,超时则强制退出方法执行 C#函数运行超时则终止执行(任意参数类型及参数个数通用版)

    我自己写的 /// <summary> /// 函数运行超时则终止执行(超时则返回true,否则返回false) /// </summary> /// <typepara ...

  9. 关于struts2中action请求会执行两次的问题

    关于struts2中action请求会执行两次的问题     在struts2中发现,调用action中的方法,方法会被执行两次,后来发现调用的方法是get开头的,把它改为其他名称开头的后,就不会执行 ...

随机推荐

  1. Tkinter Label(标签)

      Tkinter Label : 这个小工具,实现了显示框,在那里你可以把文本或图像.这个widget中显示的文本可以在任何时候你想要更新.   这个小工具,实现了显示框,在那里你可以把文本或图像. ...

  2. 28_java之mysql的CRUD

    01数据库概念 * A: 什么是数据库 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作. * B: 什么是数据 ...

  3. Rhythmk 一步一步学 JAVA (17):Servlet 文件上传

    1.环境 : JDK 1.6 , Tomcat 7.0 2.第三方类库: commons-fileupload-1.3.1.jar commons-io-2.4.jar 3.web.xml配置: &l ...

  4. VS编译静态库 .lib 其中Release 版本比Debug版本要大好多原因

    如果工程代码使用了: 把此选项关闭即可减少库大小不少:

  5. [Python Study Notes]pynput实现对鼠标控制

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ...

  6. axis2 webService开发指南(1)

    参考文件:blog.csdn.net/IBM_hoojo http://hoojo.cnblogs.com/ 1 WebService简介 WebService让一个程序可以透明的调用互联网的程序,不 ...

  7. Setup Apache2 in Debian 9 and enable two ports for two sites

    root@debian:~# apt-get install apache2 root@debian:~# cd /etc/apache2/ root@debian:/etc/apache2# ls ...

  8. Java CST格式字符串转换成Date类型的数据

    Date date = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US).parse("We ...

  9. FreeSWITCH 客户端fs_cli连接设置(acl)

    FreeSWITCH 默认配置只能 在本机连接, 要从 外面连接, 就要配置: acl.conf.xml::network-lists/list event_socket.conf.xml::appl ...

  10. RimLight(轮廓光) - Shader

    [RimLight(轮廓光) - Shader] RimLight指的是物体的轮廓光.效果如下: 轮廓光的强度通过 1.0 - dot(normal, eye_vector)来计算.使用这个公式,则指 ...