在本系列的第二篇简要的讲述了Action的选择条件本篇深入讲述一下Action选择的过程在上一篇中我们已经讲到了Controller的激活过程中已经说到了设置Controller的ControllerContext,再接着就是调用HttpController的ExectuteAsync方法.在该方法中大致可以分成两步:选择HttpActionDescriptor,参数绑定,执行Aciton。

HttpActionDescriptor

如HttpControllerDescriptor一样,HttpActionDescriptor也保存了Action的基本信息。并提供了执行的方法(ExecuteAsync)。

public abstract class HttpActionDescriptor

 { 

public abstract string ActionName { get; } 

public HttpConfiguration Configuration { get; set; } 

public HttpControllerDescriptor ControllerDescriptor { get; set; } 

public virtual ConcurrentDictionary<object, object> Properties { get; } 

public abstract Type ReturnType { get; } 

public virtual Collection<Net.Http.HttpMethod> SupportedHttpMethods { get; } 

public abstract Task<object> ExecuteAsync(HttpControllerContext controllerContext, IDictionary<string, object> arguments, CancellationToken cancellationToken); 

public virtual Collection<T> GetCustomAttributes<T>() where T : class; 

public virtual Collection<T> GetCustomAttributes<T>(bool inherit) where T : class; 

public virtual Collection<Filters.IFilter> GetFilters(); 

 }

与HttpControllerDescriptor一样,Configuration也是引用GlobalConfiguration.Configuration,ActionName与ReturnType分别表示Action的名称与返回值。SupportedHttpMethods表示Action能够支持的HttpMethod集合。HttpActionDescriptor同样具有一个只读属性Properties,可以用它来添加数据到HttpActionDescriptor上。

在WebAPI中对HttpActionDescriptor的默认派生类是ReflectedHttpActionDescriptor。

public class ReflectedHttpActionDescriptor : HttpActionDescriptor

 { 

public MethodInfo MethodInfo { get; set; } 

}

对于HttpActionDescriptor,ReflectedHttpActionDescriptor只增加了一个MethodInfo,我们从ReflectedHttpActionDescriptor的命名与MethodInfo属性就可以想到ReflectedHttpActionDescriptor采用反射的方式去执行Action。

HttpParameterDescriptor

对于Action的参数,它不仅要参与Action的选择,同时在进行WebAPI在对参数绑定的时候也有较复杂的逻辑,所以WebAPI对Action的参数也进行了封装,即HttpParameterDescriptor。

public abstract class HttpParameterDescriptor

 { 

public HttpActionDescriptor ActionDescriptor { get; set; } 

public HttpConfiguration Configuration { get; set; } 

public virtual object DefaultValue { get; } 

public virtual bool IsOptional { get; } 

public virtual ParameterBindingAttribute ParameterBinderAttribute { get; set; } 

public abstract string ParameterName { get; } 

public abstract Type ParameterType { get; } 

public virtual string Prefix { get; } 

public ConcurrentDictionary<object, object> Properties { get; } 

public virtual Collection<T> GetCustomAttributes<T>() where T : class; 

 }

在HttpActionDescriptor的GetParameters方法就是返回Action下的HttpParameterDescriptor集合。

WebAPI中HttpParameterDescriptor的派生类是ReflectedHttpParameterDescriptor。

HttpActionSelector

HttpActionSelector也是WebAPI中的"标准化组件"顾名思义它是来查找Action的。

public interface IHttpActionSelector

{ 

ILookup<string, HttpActionDescriptor> GetActionMapping(HttpControllerDescriptor controllerDescriptor); 

HttpActionDescriptor SelectAction(HttpControllerContext controllerContext); 

}

与HttpControllerSelector,IHttpActionSelector也提供了两方法: GetActionMapping, SelectAction,分别用来返回Controller下的所有Action与请求的Action。

因为反射在解析方法的时候是相对耗时的操作,所以ReflectionActionDescriptor也做了缓存。

ASP.NET WebAPI 10 Action的选择(二)的更多相关文章

  1. Asp.Net WebApi核心对象解析(二)

    在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...

  2. 使用ASP.Net WebAPI构建REST服务(二)——路由

    REST并没有像传统的RPC服务那样显式指定了服务器函数的访问路径,而是将URL根据一定的规则映射为服务函数入口,这个规则就称之为路由.Asp.Net WebAPI的路由方式和Asp.Net MVC是 ...

  3. ASP.NET WebAPI 12 Action的执行

    Action的激活大概可以分为如下两个步骤:Action对应方法的调用,执行结果的协商.在WebAPI中由HttpActionInvoker(System.Web.Http.Controllers)进 ...

  4. ASP.NET WebAPI 02-Action的选择(一)

    在WebAPI对于Action的选择主要经过:Action方法名匹配,Http方法匹配,参数匹配三步. Http方法匹配 WebAPI提供了三种Http方法的选择方式,分别是:方法前缀,AcceptV ...

  5. 重温ASP.NET WebAPI(二)进阶

    重温ASP.NET WebAPI(二)进阶   介绍 本文为个人对WebApi的回顾无参考价值. 本文内容: Rest和UnitOfWork 创建WebAPi的流程 IOC-Unity的使用 MEF ...

  6. Asp.Net WebApi Action命名中已‘Get’开头问题

    ApiController 中的Action 命名已‘Get’开头,Post方法提交失败 场景: 1.action命名使用Get开头 /// <summary> /// 获取用户的未读消息 ...

  7. WebApi官网学习记录---webapi中controller与action的选择

    如果framework找到一个匹配的URI,创建一个包含占位符值的字典,key就是这些占位符(不包括大括号),value来自URI或者默认值,这个字典存储在IHttpRouteData对象中.默认值可 ...

  8. ASP.NET Web API 框架研究 Action的选择

    如何从HttpController众多方法里如何选择出有效的Action方法?主要分一下几个步骤: 首先,获取候选HttpActionDescriptor列表(ILookup(string,HttpA ...

  9. 路由其实也可以很简单-------Asp.net WebAPI学习笔记(一) ASP.NET WebApi技术从入门到实战演练 C#面向服务WebService从入门到精通 DataTable与List<T>相互转换

    路由其实也可以很简单-------Asp.net WebAPI学习笔记(一)   MVC也好,WebAPI也好,据我所知,有部分人是因为复杂的路由,而不想去学的.曾经见过一位程序猿,在他MVC程序中, ...

随机推荐

  1. Clappr——开源的Web视频播放器

    巴西著名的门户网站Globo.com(视频播放器),使用的是基于OSMF的Flash组件.在最近几年的发展过程中,Globo为视频平台陆续添加了不少额外功能,例如: 字幕,广告,画中画播放等.然而,由 ...

  2. Dennis与Ken爷爷的UNIX/C世界

     沉寂了很久了,时间在不断地逝去,转眼又到了新的一年,2013的发生了太多,Beta版本.辞职.职位转换.ARM.Driver.初级厨艺.Dx11.GPU.CPU.登山.GNU/Linux.Cross ...

  3. 聊一聊google的Knowledge Graph

    什么是Knowledge Graph? 它是google用于增强它的搜索引擎的功能和提高搜索结果质量的一种技术.在2012年5月16日提出,除了提供基本的与主题相关的链接服务之外,它还能结构化与主题相 ...

  4. 内存调试的东西D/dalvikvm( 809 ): GC_CONCURRENT freed

    一般Java虚拟机要求支持verbosegc选项,输出详细的垃圾收集调试信息.dalvik虚拟机很安静的接受verbosegc选项,然后什么都不做.dalvik虚拟机使用自己的一套LOG机制来输出调试 ...

  5. 没有找到cxcore100.dll,因此这个应用程序未能启动,重新安装应用程序可能会修复此问题

    第一种情况: 出现这个问题多数是因为“环境变量PATH”未设置,虽然你可能在安装的过程中勾选了Add <...>\OpenCV\bin to the system PATH项!安装Open ...

  6. Maven进价:Maven构建系列文章

    Maven:基于Java平台的项目构建.依赖管理和项目信息管理. 1.构建 Maven标准化了构建过程 构建过程:编译.运行单元测试.生成文档.打包和部署 避免重复:设计.编码.文档.构建 2.依赖管 ...

  7. ruby -- 进阶学习(十七)应用代码优化

    ROR开发,代码优化的方法下面这两项是比较重要的: link_to  Rails的link_to是非常慢的,它的代码实现过于复杂,特别是Rails1.2引入了REST以后,大量的命名路由被使用,这些命 ...

  8. 数据可视化(2)--Justgage

    JustGage 是一个 JavaScript 插件来生成很漂亮的仪表盘,基于 Raphaël 库做向量图绘制. JustGage 完全基于 SVG,因此支持几乎所有浏览器,包括:IE6+, Chro ...

  9. 《微信小程序七日谈》- 第三天:玩转Page组件的生命周期

    <微信小程序七日谈>系列文章: 第一天:人生若只如初见: 第二天:你可能要抛弃原来的响应式开发思维: 第三天:玩转Page组件的生命周期: 第四天:页面路径最多五层?导航可以这么玩 前两篇 ...

  10. DBA需要掌握的shell知识

    每个中高级DBA都需要掌握一些简单脚本的编写,这样才能从繁杂重复的基础维护工作中解脱出来,才能有时间去研究更有价值的技术.VBird在讲shell script的时候,给出了几个经典的小范例练习,对于 ...