ASP.NET WebAPI 10 Action的选择(二)
在本系列的第二篇简要的讲述了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的选择(二)的更多相关文章
- Asp.Net WebApi核心对象解析(二)
在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...
- 使用ASP.Net WebAPI构建REST服务(二)——路由
REST并没有像传统的RPC服务那样显式指定了服务器函数的访问路径,而是将URL根据一定的规则映射为服务函数入口,这个规则就称之为路由.Asp.Net WebAPI的路由方式和Asp.Net MVC是 ...
- ASP.NET WebAPI 12 Action的执行
Action的激活大概可以分为如下两个步骤:Action对应方法的调用,执行结果的协商.在WebAPI中由HttpActionInvoker(System.Web.Http.Controllers)进 ...
- ASP.NET WebAPI 02-Action的选择(一)
在WebAPI对于Action的选择主要经过:Action方法名匹配,Http方法匹配,参数匹配三步. Http方法匹配 WebAPI提供了三种Http方法的选择方式,分别是:方法前缀,AcceptV ...
- 重温ASP.NET WebAPI(二)进阶
重温ASP.NET WebAPI(二)进阶 介绍 本文为个人对WebApi的回顾无参考价值. 本文内容: Rest和UnitOfWork 创建WebAPi的流程 IOC-Unity的使用 MEF ...
- Asp.Net WebApi Action命名中已‘Get’开头问题
ApiController 中的Action 命名已‘Get’开头,Post方法提交失败 场景: 1.action命名使用Get开头 /// <summary> /// 获取用户的未读消息 ...
- WebApi官网学习记录---webapi中controller与action的选择
如果framework找到一个匹配的URI,创建一个包含占位符值的字典,key就是这些占位符(不包括大括号),value来自URI或者默认值,这个字典存储在IHttpRouteData对象中.默认值可 ...
- ASP.NET Web API 框架研究 Action的选择
如何从HttpController众多方法里如何选择出有效的Action方法?主要分一下几个步骤: 首先,获取候选HttpActionDescriptor列表(ILookup(string,HttpA ...
- 路由其实也可以很简单-------Asp.net WebAPI学习笔记(一) ASP.NET WebApi技术从入门到实战演练 C#面向服务WebService从入门到精通 DataTable与List<T>相互转换
路由其实也可以很简单-------Asp.net WebAPI学习笔记(一) MVC也好,WebAPI也好,据我所知,有部分人是因为复杂的路由,而不想去学的.曾经见过一位程序猿,在他MVC程序中, ...
随机推荐
- 如何通过XShell传输文件
转载孟光孟叔的博客: https://learndevops.cn/index.php/2016/06/14/how-to-transfer-file-using-xshell xshell目前最好 ...
- Android客户端与PHP服务端交互(一)---框架概述
背景 作为一个普通上班族,总是想做一些自认为有意义的事情,于是乎准备成立一个工作室,尽管目前正在筹备阶段,但是之前有些朋友提出一些需求的时候,我发现自己的能力还是有限,直到最近和一些技术牛朋友聊起这事 ...
- Hadoop 2.4.1 登录认证配置小结
1.简单模式 这种模式,配置简单,使用简单. core-site.xml添加 <property> <name>hadoop.security.authorization< ...
- Eclipse中如何修改SVN的地址
在SVN服务端的IP更改后,客户端SVN的连接地址可以在Eclipse中进行修改,方法如下: 首先:在Eclipse中选择Windows-> Show View->others 就会出现[ ...
- CLR via C#深解笔记六 - 泛型
面向对象编程一个好处就是“代码重用”,极大提高了开发效率.如是,可以派生出一个类,让它继承基类的所有能力,派生类只需要重写虚方法,或添加一些新的方法,就可以定制派生类的行为,使之满足开发人员的需求. ...
- Part 2: Oracle E-Business Suite on Cloud FAQ
Running Oracle E-Business Suite on Oracle Cloud is simple, but it doesn't take too much effort to co ...
- Go语言获取项目当前路径
package main import ( "fmt" "os" "os/exec" "strings" ) func ...
- 【原】Linux Raid 实验
本文参照以下两个链接,将实验重做了一遍,目的就是加深印象及提升实操能力 参照链接:http://www.opsers.org/base/learning-linux-the-day-that-the- ...
- 发布大幅重构优化的 TouchVG 1.0.2
发布大幅重构优化的 TouchVG 1.0.2,支持SVG.多模块扩展结构,欢迎评阅改进.提交pull request. https://github.com/rhcad/touchvg 关于 Tou ...
- 尝试在virtualbox fedora21 下安装additions和mount share folder
安装这个additions的过程,基本上可以参照 http://gamblisfx.com/how-to-install-virtualbox-guest-additions-on-fedora-21 ...