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程序中, ...
随机推荐
- How to Debug Enterprise Portal Code in Dynamics AX 2009
转载 To set up debugging for pages1. Log into the server that is running the AOS.2. Open the Microsoft ...
- 程序员之路:以Android证道
大道三千,何以证道? 最近有私信.邮件给我咨询一些职业生涯规划的同学,我在这里以过来人的身份给大家一些建议. 任何行业,任何职位,无论高低,无论大小,都可以分为广博.精深两个方向. 精深自然指的是在某 ...
- iOS开发之身份证号码校验
// // Card.h // THCStore // // Created by Mac on 15/7/15. // Copyright (c) 2015年 Mac. All rights ...
- java之抽象类
1.用abstract关键字来修饰一个类时,这个类叫做抽象类:用abstract来修饰一个方法时,该方法叫做抽象方法. 2.含有抽象方法的类必须被声明抽象类,抽象类必须被继承,抽象方法必须被重写. 3 ...
- netty ByteToMessageDecoder 分析
ByteToMessageDecoder 1.socket 移除时触发,最后次读数据处理 @Override public final void handlerRemoved(ChannelHandl ...
- DSP中CMD文件
DSP中CMD文件 (2012-12-26 20:54:17) 转载▼ 标签: 杂谈 分类: DSP FPGA DSP的存储器的地址范围,CMD是主要是根据那个来编的.CMD 它是用来分配rom和ra ...
- 【转】Linux 概念架构的理解
转:http://mp.weixin.qq.com/s?__biz=MzA3NDcyMTQyNQ==&mid=400583492&idx=1&sn=3b18c463dcc451 ...
- java面试欠缺知识点总结
针对最近面试被问到的问题,总结自己欠缺的知识点,并要在接下来的1年内加强这些知识: Java方面:反射.线程concurrent包: Spring方面:Ioc和Aop.事务: 持久化框架:设计并实现分 ...
- Android通过编码实现GPS开关
在Android 2.2以后才可使用 import android.content.ContentResolver; import android.content.Context; import an ...
- java中Finally块的执行
在try{}catch{}finally{}块中,都知道finally子块是肯定会执行的.当然也有个别情况,当在try{}或者catch{}块中出现强制退出System.exti(int)时,fina ...