在Asp.Net Web API中,请求的目标是定义在某个HttpController中的某个Action方法。当请求经过Asp.Net Web API消息处理管道到达管道“龙尾”后,在“龙尾”HttpRoutingDispatcher中将会进行HttpController的筛选和激活工作。那么,Asp.Net Web API在筛选和激活HttpController过程中做了哪些操作呢?下面我们开始今天的主题:通过查看源码,剖析Asp.Net Web API中HttpController的激活。

在前面剖析Asp.Net Web API的消息处理管道过程中,我们知道处于管道“龙尾”处的是类型HttpRoutingDispatcher,在HttpRoutingDispatcher中通过类型HttpControllerDispatcher进行HttpController的筛选和激活工作,如下:

从上面源码中可以知道,进行筛选和激活HttpController的入口在HttpControllerDispatcher类型中。并且,在上面的源码中,我们看到了两个很重要的类型:HttpControllerContext和HttpControllerDescriptor。再继续下面的内容之前,我们先来看看这两个类型在HttpController的激活过程中起到哪些作用。

首先看一下HttpControllerContext类型,如下。HttpControllerContext表示执行HttpController的上下文,在HttpController执行的过程中需要用到其封装的数据。

下面再看看HttpControllerDescriptor类型,如下。HttpControllerDescriptior类型封装了某个HttpController类型的元数据,根据这些封装的元数据,HttpControllerDescriptior可以创建对应的HttpController。

看完上面HttpControllerContext类型和HttpControllerDescriptor类型后,我们继续前面关于HttpController的激活剖析。从前面的源码中可以看到,在HttpControllerDispatcher类型中,通过其属性ControllerSelector可以获取到HttpControllerDescriptor对象,然后可以由获取到的HttpControllerDescriptor对象创建HttpController对象。下面我们就来看看ControllerSelector是如何获取到HttpControllerDescriptor对象的。

到目前为止,我们已经获取到了HttpControllerDescriptor对象,下面我们利用获取到的HttpControllerDescriptor对象创建HttpController。

由上面源码我们可以知道:在默认情况下,解析出来的HttpController类型会被缓存起来;创建用于描述HttpController的HttpControllerDescriptor对象也会被缓存起来;但是对于由HttpControllerDescriptor对象创建的HttpController对象是不会被缓存的,也就是说每次请求都会通过反射创建一个新的HttpController对象用于处理请求。

总结:

在Asp.Net Web API消息处理管道中,当请求流转到“龙尾”HttpRoutingDispatcher中时,默认情况下会将请求传递给HttpControllerDispatcher对象,然后由HttpControllerDispatcher对象实现了请求目标HttpController对象的激活与执行动作,之后将代表响应消息的HttpResponseMessage对象返回给HttpRoutingDispatcher对象,由HttpRoutingDispatcher对象将响应消息回传给消息处理管道进行响应处理以完成最终的请求的处理。

至此,关于Asp.Net Web API中HttpController的激活原理剖析完毕,能力有限,如有错误之处,欢迎指正。

剖析Asp.Net Web API中HttpController的激活的更多相关文章

  1. 目标HttpController在ASP.NET Web API中是如何被激活的:目标HttpController的选择

    目标HttpController在ASP.NET Web API中是如何被激活的:目标HttpController的选择 ASP.NET Web API能够根据请求激活目标HttpController ...

  2. 目标HttpController在ASP.NET Web API中是如何被激活的:目标HttpController的创建

    目标HttpController在ASP.NET Web API中是如何被激活的:目标HttpController的创建 通过上面的介绍我们知道利用HttpControllerSelector可以根据 ...

  3. ASP.NET Web API中的Controller

    虽然通过Visual Studio向导在ASP.NET Web API项目中创建的 Controller类型默认派生与抽象类型ApiController,但是ASP.NET Web API框架本身只要 ...

  4. IoC在ASP.NET Web API中的应用

    控制反转(Inversion of Control,IoC),简单地说,就是应用本身不负责依赖对象的创建和维护,而交给一个外部容器来负责.这样控制权就由应用转移到了外部IoC容器,控制权就实现了所谓的 ...

  5. ASP.NET Web API的HttpController是如何被激活的?

    ASP.NET Web API的HttpController是如何被激活的? HttpController与HttpControllerDescriptor 程序集的解析 HttpController ...

  6. 剖析Asp.Net Web API路由系统---WebHost部署方式

    上一篇我们剖析了Asp.Net路由系统,今天我们再来简单剖析一下Asp.Net Web API以WebHost方式部署时,Asp.Net Web API的路由系统内部是怎样实现的.还是以一个简单实例开 ...

  7. 在ASP.NET Web API中使用OData

    http://www.alixixi.com/program/a/2015063094986.shtml 一.什么是ODataOData是一个开放的数据协议(Open Data Protocol)在A ...

  8. ASP.NET Web API 中的异常处理(转载)

    转载地址:ASP.NET Web API 中的异常处理

  9. 【ASP.NET Web API教程】6.2 ASP.NET Web API中的JSON和XML序列化

    谨以此文感谢关注此系列文章的园友!前段时间本以为此系列文章已没多少人关注,而不打算继续下去了.因为文章贴出来之后,看的人似乎不多,也很少有人对这些文章发表评论,而且几乎无人给予“推荐”.但前几天有人询 ...

随机推荐

  1. 更改Windows Live Writer默认日志与草稿保存路径

    目的:把保存Windows Live Writer的日志与草稿文件夹My Weblog Posts移动到E:\Blog\路径下 用mklink命令,创建E:\Blog\路径下的My Weblog Po ...

  2. tap是什么意思

    分光是数据通过光纤传输:分路是数据通过网线传输.粗浅的说,Tap的概念类似于“三通”的意思,即原来的流量正常通行,同时分一股出来供监测设备分析使用. 其实这只是最简单的Tap的概念,目前的技术发展已经 ...

  3. 在Spring MVC Controller的同一个方法中,根据App还是WEB返回JSON或者HTML视图。

    如有高见,欢迎交流! 最近在做一个web的项目,web版已经开发完毕,现在正在进行手机APP的开发,开发中遇到一个问题: 就是web版和app版都有登录功能,本想着是分别走不同的URL,实际开发的时候 ...

  4. 配置Log4J(转载)

    Log4J的配置文件(Configuration File)就是用来设置记录器的级别.存放器和布局的,它可接key=value格式的设置或xml格式的设置信息.通过配置,可以创建出Log4J的运行环境 ...

  5. 使用(Drawable)资源———AnimationDrawable资源

    AnimationDrawable代表一个动画. 下面以补间动画为例来介绍如何定义AnimationDrawable资源,定义补间动画的XML资源文件已<set.../>元素作为根元素,该 ...

  6. mysql 常用技巧

    1.正则使用 比 LIKE 会牺牲很多的系统资源 尽量不要用 正则的语法和JS PHP 差不多 select * from t1 where email REGEXP "@163[,.]co ...

  7. QT第二天学习

    回顾: qmake: qmake -project //生成*.pro文件 qmake //makefile make 注:if(qmake -v  >=5) then QT += widget ...

  8. Cisco VPN Client Error 56解决

    Cisco VPN Client Error 56解决 VPN Client报错 650) this.width=650;" style="width:575px;height:1 ...

  9. Goldengate双向复制配置

    一.Goldengate双向复制配置 1.1.在进行如下配置之前,先在源数据库source system(原来的目标数据库)端 添加辅助的redolog配置: SQL>alter databas ...

  10. php之 人员的权限管理(RBAC)

    1.想好权限管理的作用? 2.有什么权限内容? 3.既然有权限管理那么就会有管理员? 4.登录后每个人员的界面会是不一样的? 一.想好这个权限是什么? 就做一个就像是vip的功能,普通用户和vip用户 ...