剖析Asp.Net Web API中HttpController的激活

时间:2022-11-07 21:42:09

在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的筛选和激活工作,如下:

剖析Asp.Net Web API中HttpController的激活

剖析Asp.Net Web API中HttpController的激活

剖析Asp.Net Web API中HttpController的激活

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

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

剖析Asp.Net Web API中HttpController的激活

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

剖析Asp.Net Web API中HttpController的激活

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

剖析Asp.Net Web API中HttpController的激活

剖析Asp.Net Web API中HttpController的激活

剖析Asp.Net Web API中HttpController的激活

剖析Asp.Net Web API中HttpController的激活

剖析Asp.Net Web API中HttpController的激活

剖析Asp.Net Web API中HttpController的激活

剖析Asp.Net Web API中HttpController的激活

剖析Asp.Net Web API中HttpController的激活

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

剖析Asp.Net Web API中HttpController的激活

剖析Asp.Net Web API中HttpController的激活

剖析Asp.Net Web API中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. GZAPI框架初识

    新建一个MVC项目(GZAPIFramework.Demo): mvc:用于API接口文档查看,Log日志查看 webapi:api调用 新建一个Biz类库并添加nuget引用: 搜索GZAPI.Co ...

  2. linux内核链表分析

    一.常用的链表和内核链表的区别 1.1  常规链表结构        通常链表数据结构至少应包含两个域:数据域和指针域,数据域用于存储数据,指针域用于建立与下一个节点的联系.按照指针域的组织以及各个节 ...

  3. C# 解压RAR压缩文件

    此方法适用于C盘windows文件夹中有WinRAR.exe文件 /// 解压文件(不带密码) RAR压缩程序 返回解压出来的文件数量 /// </summary> /// <par ...

  4. hide&lpar;1000&rpar;跟show&lpar;1000&rpar;

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. mysql 加入�列,改动列,删除列。

    MySQL 加入�列,改动列,删除列 ALTER TABLE:加入�,改动,删除表的列,约束等表的定义. 查看列:desc 表名; 改动表名:alter table t_book rename to ...

  6. Day15 Javascipt内容补充

    JavaScript函数: 函数: function 函数名(a,b,c){ 执行代码 } 1,如何去找到标签 Dom直接选择器: 1,找到标签 #获取单个元素 document.getElement ...

  7. 阿里,百度面试90&percnt;会问的Java面试题

    题目一 请对比 Exception 和 Error,另外,运行时异常与一般异常有什么区别? 考点分析: 分析 Exception 和 Error 的区别,是从概念角度考察了 Java 处理机制.总的来 ...

  8. Elasticsearch入门,这一篇就够了

    实时搜索引擎Elasticsearch Elasticsearch(简称ES)是一个基于Apache Lucene(TM)的开源搜索引擎,无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进 ...

  9. Head First Servlets &amp&semi; JSP 学习笔记 第三章 —— MVC迷你教程

    临渊羡鱼,不如退而结网!是时候动手搞事情了! 我们的四大步骤: ①分析用户的视图(也就是浏览器要显示的东西),以及高层体系结构: (这个就是所谓的前端吧?用JSP?JSP可以当成Html来用吧?高层体 ...

  10. &period;Net线程问题解答

    基础篇 怎样创建一个线程 受托管的线程与 Windows线程 前台线程与后台线程 名为BeginXXX和EndXXX的方法是做什么用的 异步和多线程有什么关联 WinForm多线程编程篇 我的多线程W ...