在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. Valgrind 快速入门

    1. 介绍 Valgrind工具组提供了一套调试与分析错误的工具包,能够帮助你的程序工作的更加准确,更加快速.这些工具之中最有名的是Memcheck.它能够识别很多C或者C++程序中内存相关的错误,这 ...

  2. ashx文件中使用session提示“未将对象引用设置到对象的实例”

    using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Data;u ...

  3. Python3基础 闭包 简单示例

    镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.-------------------------------------- ...

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

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

  5. Java经典案例之-判断质数(素数)

    /** * 描述:任意输入两个数n,m(n<m)判断n-m之间有多少个素数,并输出所有素数. * 分析:素数即质数,除1和本身之外,不能被其他自然数整除的数. * 判断素数的方法为:用一个数分别 ...

  6. Delphi TRect函数例子

    {   在网上看到个这个例子感觉还不错,将它移到自己的博客里没事的时候看看:   TRect    作用:保存一个矩形的左上角和右下角的坐标值:      声明:       type TRect = ...

  7. js架构设计模式——前端MVVM框架设计及实现(二)

    前端MVVM框架设计及实现(二) 在前端MVVM框架设计及实现(一)中有一个博友提出一个看法: “html中使用mvvm徒增开发成本” 我想这位朋友要表达的意思应该是HTML定义了大量的语法标记,HT ...

  8. document.form.command.value

    问题:在一个JSP页面中需要多个提交按钮,每个按钮点击后需要把同一个form提交到不同的页面进行处理 解决:用JS. <html><head><title>一个表单 ...

  9. GCD教程(一):基本概念

    在网上看到关于GCD的一个很不错的教程,这里做一下转载 原帖地址:http://www.dreamingwish.com/dream-2012/of-of-of-of-gcd-introduced-1 ...

  10. JAVA轻量级文件监控

    原文地址:http://blog.csdn.net/three_man/article/details/31012903?utm_source=tuicool 介绍 本文主要介绍一种轻量级的文件监控方 ...