在本系列的第二篇简要的讲述了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. FastSocket客户端/服务端通讯示例

    新建控制台项目,命名为Server 添加FastSocket.SocketBase,FastSocket.Server引用   Socket命令服务类: Sodao.FastSocket.Server ...

  2. UITabBarController的一些基础设置

    利用代码添加UITabBarController - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOpti ...

  3. cocos在win平台exe无法使用 UserDefault 解决方法

    exe模拟器用来调度cocos本来是很方便的事情,但最近很多win10策划无法调用UserDefault.一直以为是权限问题,今天有空读一下码才发现.原来是cocos的bug.存在本地的UserDef ...

  4. ffmpeg中的sws_scale算法性能测试

    经常用到ffmpeg中的sws_scale来进行图像缩放和格式转换,该函数可以使用各种不同算法来对图像进行处理.以前一直很懒,懒得测试和甄 别应该使用哪种算法,最近的工作时间,很多时候需要等待别人.忙 ...

  5. 许可EDM营销是个长期过程

    为什么这么说呢?基于博主自己这三四年的理解,许可EDM营销确实是个长期的过程,这跟一般的EDM营销有一定的区别. 大多数时候不会有立竿见影的效果,而且需要持续地不间断地进行到底,这也是很多企业实施许可 ...

  6. Ubuntu 中搭建 LAMP 及 php 开发工具

    所谓 LAMP,指的是:Linux+Apache+Mysql+Php 仅以此文做一个备忘录 Step1. 安装 Apache 1. 在 terminal 中输入一下命令并执行: sudo apt-ge ...

  7. js webapp 滑动事件

    var startX, startY, endX, endY; $(".detailImg").on("touchstart", touchStart);$(& ...

  8. 动态密码卡TOTP算法

    TOTP NET实现:http://googleauthcsharp.codeplex.com/ 引用:http://www.cnblogs.com/wangxin201492/p/5030943.h ...

  9. C++的Trigraph

    ??=include <stdio.h> class HelloWolrd ??< public: void Trigraph() ??< printf("Hello ...

  10. java中产生对象的两种方式

    /* * 普通new对象的过程! */ Person pp = new Person(); System.out.println(pp); /* * 利用代用参数的构造器产生对象实例! * 首先获得相 ...