在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. mongodb学习(二)分级查询数组中的值

    (PS: 标题有点不妥当...) 大概是这样...数据结构如下: 需要模糊查询title的值... mongodb中操作语句: 主要是注意这里urlElements不需要加[0]...我开始的时候写成 ...

  2. 【滚动数组】【状压dp】Gym - 100956F - Colored Path

    f(i,j,S)表示到(i,j),且经由的路径上的颜色集合为S的价值的最小值,从上方和左方转移过来即可. 要注意,内存不足,需要滚动数组优化,即使用了map,还是需要. 路径输出的时候,可以再跑一遍d ...

  3. Android Studio文件目录介绍

    一.安装的时候并不理解很多东西的用处,只是根据教程来做,所以想整理一下思路: android sdk里的各目录作用: 1.AVD Manager.exe:虚拟机管理工具,用于建立和管理虚拟机. 2.S ...

  4. 如何使用Grunt(好文)

    Grunt 是什么? Grunt 基于Node.js之上,是一个以任务处理为基础的命令行工具,可以减少优化开发版本为发布版本所需的人力和时间,从而加速开发流程.它的工作原理是把这 些工作整合为不同的任 ...

  5. freemarker配置,使用

    最近在项目中用到freemarker,总是报一些莫名其妙的错误. 调查得知是由于在配置文件中属性[tag_syntax]的设置问题,我们的环境下该属性(auto_detect)默认设置了自动检测,也就 ...

  6. 如何使用php session

    学会php session可以在很多地方使用,比如做一个后台登录的功能,要让程序记住用户的session,其实很简单,看了下面的文章你就明白了.   PHP session用法其实很简单它可以把用户提 ...

  7. Java 获取url参数

    1. 方式一:使用HttpServletRequest对象 String id = arg0.getParameter("id"); mv.addObject("id&q ...

  8. JDK中的插入排序

    算法 有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法--插入排序法,插入排序的基本操作就是将一个数据插入到已经排好 ...

  9. spring mvc 与 jasper Report集成

    http://blog.csdn.net/jia20003/article/details/8471169 注意其中的图片地址说明: 如果有子报表,也会到class文件夹中去寻找: 如果子报表有路径的 ...

  10. 在GEM5模拟器运行时,对Kill命令的使用

    在Linux下开发执行GEM5程序时,需要先启动GEM5,然后使用telnet对GEM5进行连接,才能看到串口信息.因为操作步骤多,所以写了脚本用来运行GEM5和Telnet程序,并且对两个程序进行监 ...