剖析Asp.Net Web API中HttpController的激活
在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的激活的更多相关文章
- 目标HttpController在ASP.NET Web API中是如何被激活的:目标HttpController的选择
目标HttpController在ASP.NET Web API中是如何被激活的:目标HttpController的选择 ASP.NET Web API能够根据请求激活目标HttpController ...
- 目标HttpController在ASP.NET Web API中是如何被激活的:目标HttpController的创建
目标HttpController在ASP.NET Web API中是如何被激活的:目标HttpController的创建 通过上面的介绍我们知道利用HttpControllerSelector可以根据 ...
- ASP.NET Web API中的Controller
虽然通过Visual Studio向导在ASP.NET Web API项目中创建的 Controller类型默认派生与抽象类型ApiController,但是ASP.NET Web API框架本身只要 ...
- IoC在ASP.NET Web API中的应用
控制反转(Inversion of Control,IoC),简单地说,就是应用本身不负责依赖对象的创建和维护,而交给一个外部容器来负责.这样控制权就由应用转移到了外部IoC容器,控制权就实现了所谓的 ...
- ASP.NET Web API的HttpController是如何被激活的?
ASP.NET Web API的HttpController是如何被激活的? HttpController与HttpControllerDescriptor 程序集的解析 HttpController ...
- 剖析Asp.Net Web API路由系统---WebHost部署方式
上一篇我们剖析了Asp.Net路由系统,今天我们再来简单剖析一下Asp.Net Web API以WebHost方式部署时,Asp.Net Web API的路由系统内部是怎样实现的.还是以一个简单实例开 ...
- 在ASP.NET Web API中使用OData
http://www.alixixi.com/program/a/2015063094986.shtml 一.什么是ODataOData是一个开放的数据协议(Open Data Protocol)在A ...
- ASP.NET Web API 中的异常处理(转载)
转载地址:ASP.NET Web API 中的异常处理
- 【ASP.NET Web API教程】6.2 ASP.NET Web API中的JSON和XML序列化
谨以此文感谢关注此系列文章的园友!前段时间本以为此系列文章已没多少人关注,而不打算继续下去了.因为文章贴出来之后,看的人似乎不多,也很少有人对这些文章发表评论,而且几乎无人给予“推荐”.但前几天有人询 ...
随机推荐
- 可持久化Trie树初步
可持久化Trie树和可持久化线段树很像,依次插入信息,通过减法来进行历史版本查询. 2015年11月27日 bzoj3261 最大异或和 我们需要计算 a[p] xor a[p+1] xor ... ...
- Servlet_ResponseHeader
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletExcepti ...
- MVC笔记1
测试实体类 public class Test { public int id{get;set;} [Required(ErrorMessage="不能为空喔")] [String ...
- Spring基本使用方法_Bean对象
Spring基本使用方法_Bean对象 Struts与Hibernate可以做什么事? Struts MVC中控制层解决方案.可以进行请求数据自动封装,类型转换,文件上传,效验..... Hibern ...
- UVa 10360 - Rat Attack
题目大意:有一个1025*1025的矩阵,每个矩阵元素保存这个点上老鼠的数量.现有一种气体炸弹,能覆盖“半径”为d的矩形,在这个范围内可以消灭所有的老鼠,让你找出合适的放置炸弹的位置使的消灭的老鼠数量 ...
- shell 脚本连接mysql数据库查询database中表的数量和表名
#!/bin/bash MYSQLHOST="127.0.0.1" MYSQLUSER="root" MYSQLPWD="root" MYS ...
- Beautifulsoup 和selenium 的查询
Selenium There are vaious strategies to locate elements in a page. You can use the most appropriate ...
- 贴一份用delphi修改注册表改网卡MAC地址的代码
//提示:此代码需要use Registry, Common; function WriteMAC(model:integer):integer; var reg:TRegistry; begin r ...
- Cocoa 新的依赖管理工具:Carthage
昨天搞了一下pod的安装 因为之前我都是在使用pod来进行第三方库的管理 但是拿到项目之后 竟发现这个前辈是用Carthage 说真的在这之前我从来没有用过这个玩意因为我感觉用POD已经很好了啊 很方 ...
- SecureCRT 选择Courier New等其他字体.
http://justwinit.cn/post/5813/ 如何解决SecureCRT无法选择Courier New等其他字体最终解决办法:到C:\Windows\Fonts目录下,找到Courie ...