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程序中, ...
随机推荐
- 关于Android真机调测Profiler
U3D中的Profile也是可以直接在链接安卓设备运行游戏下查看的,导出真机链接U3D的Profile看数据,这样能更好的测试具体原因. 大概看了下官方的做法,看了几张帖子顺带把做法记录下来. ...
- [转载]CSS教程:实例讲解定位Position
http://www.missyuan.com/thread-395406-1-1.html 1. position:static 所有元素的默认定位都是:position:static,这意味着元素 ...
- android一键分享功能不使用任何第三方sdk
在android中有自带的一键分享功能,不过它会把所有带分享的应用都找出来,如果我们只需要一些常见的分享应用,该如何做呢? 下面看我的效果图(横屏和竖屏自动适配): 接下来看我的调用(支持图片和文字分 ...
- mongodb存储过程
MongoDB支持存储过程的使用,它的存储过程是用javascript实现的,被存在于system.js表中,可以接收和输出参数,返回执行存储过程的状态值,也可以嵌套调用. 所以我理解的Mon ...
- js最新手机号码、电话号码正则表达式
原文链接:http://caibaojian.com/regexp-example.html 正则表达式(regular expression)是一个描述字符模式的对象.使用javascript正则表 ...
- mmo设计
基于多人格斗系统设计. 总体 1.放技能/使用道具,行走,公告,聊天 共性: A.服务端代理推送 B.管道内推送 2.玩家信息(统一玩家信息查看,去除每个模块自己实现) 3.怪物掉落(统一掉落控制.领 ...
- 构造Lambda表达式
/// <summary> /// 构造Lambda表达式 /// </summary> /// <typeparam name="T">< ...
- 【Android菜鸟学习之路】环境搭建问题-修改AVD Path
更改avd默认路径
- DDD:订单管理 之 如何组织代码
背景 系统开发最难的是职责的合理分配,或者叫:“如何合理的组织代码”,今天说一个关于这方面问题的示例,希望大家多批评. 示例背景 参考数据字典 需求 OrderCode必须唯一. Total = Su ...
- Android 布局之LinearLayout
Android 布局之LinearLayout 1 LinearLayout简介 LinearLayout是线程布局.它包括2个方向(android:orientation):“水平”(horizon ...