ASP.NET WebAPI 02-Action的选择(一)
在WebAPI对于Action的选择主要经过:Action方法名匹配,Http方法匹配,参数匹配三步。
Http方法匹配
WebAPI提供了三种Http方法的选择方式,分别是:方法前缀,AcceptVerbs特性,HttpXXX特性
方法前缀:
在上一篇中都是采用的这种方式,即将Http方法作为Action的前缀。比如GetAll, PostByUrl。
另外这种方式只能指定一种Http方法,比如GetPutPostAll()只支持GET请求
AcceptVerbs特性
AcceptVerbs特性提供了两个构造函数:
public AcceptVerbsAttribute(params string[] methods)
public AcceptVerbsAttribute(string method)
通过这两个构造函数我们可以为Action的指定Http请求方式,比如:
[AcceptVerbs("POST","PUT")]
public IEnumerable<Figure> PostByBody([FromBody] Figure figure)
这个时候就可以采用Post,Put方式进行访问。
HttpXXX特性
HttpXXX方式跟AcceptVerbs类似,我们可以将其看成是AcceptVerbs的防错误方式(在拼写http方法时可能会出现失误),其格式如下:
[HttpPut]
[HttpPost]
public IEnumerable<Figure> PostByBody([FromBody] Figure figure)
ASP.NET WebAPI定义了7种对应的特性类型:
HttpGet
HttpHead
HttpPut
HttpPost
HttpPatch
HttpOptions
HttpDelete
如果采用了AcceptVerbs与HttpXXX方式,那么前缀方式将失效。AcceptVerbsAttribute与HttpXXXAttribute都实现接口IActionHttpMethodProvider,所以最终的可以采用的Http请求方法是这两种方式的并集。
Action方法名匹配
方法名的匹配因为比较简单,在这里我们来看一下VS2013默认生成的路由模板。
public static void Register(HttpConfiguration config)
{
// Web API 配置和服务 // Web API 路由
config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
VS2013默认情况下
提供的路由格式为"api/{controller}/{id}",并没有提供action,所以在进行Action查找的时候只会根据请求方式与参数进行匹配。
在Figure中定义两个方法,分别是:
public IEnumerable<Figure> GetAll()
public Figure GetFigure(string firstName)
分别用以下url进行访问:
http://localhost:7075/api/Figure
http://localhost:7075/api/Figure?firstName=Bran
此时他们调用的方法分别是GetAll, GetByQueryString
另外在FigureController再加一个无参无返回值的Get方法,现在再用http://localhost:7075/api/Figure访问就会得到"找到了与该请求匹配的多个操作"的错误消息
参数匹配
在.NET中方法可以重载,所以在Action的选择中也会有对参数的匹配过程。参数的来源于RouteData与QueryString。在匹配中,会出现以下几种情况(为了在):
1.所有参数无默认值
这种情况下就会对所有参数进行匹配,如下:
public Figure GetFromQueryString(string firstName)
public Figure GetFromQueryString(string firstName,string lastName)
用以下Url进行访问
http://localhost:7075/api/Figure/GetByQueryString?firstName=Bran
http://localhost:7075/api/Figure/GetByQueryString?firstName=Bran&lastName=Stack
分别调用的是GetFromQueryString(string firstName), GetFromQueryString(string firstName,string lastName。
但我们使用http://localhost:7075/api/Figure/GetByQueryString进行访问,会返回"404 Not FOUND"。
2.存在默认只参数
首先可以确认的是,优先进行所有参数进行匹配,如果没有匹配的Action再进行二轮匹配
public IEnumerable< Figure> GetFromQueryStringDefaultValue(string lastName="Stack")
public Figure GetFromQueryStringDefaultValue(string firstName, string lastName="Stack")
Action一通过以下url都可以访问
http://localhost:7075/api/Figure/GetFromQueryStringDefaultValue
http://localhost:7075/api/Figure/GetFromQueryStringDefaultValue?lastName=Jon
Action二通过以下Action也都可以访问
http://localhost:7075/api/Figure/GetFromQueryStringDefaultValue?firstName=Bran
http://localhost:7075/api/Figure/GetFromQueryStringDefaultValue?firstName=Bran&lastName=Stack
如果我们将Action二的firstName也设置默认值,那么上面四个url进行访问都和得到"找到了与该请求匹配的多个操作"的错误。
3.参数类型
方法的重载由参数数量、参数类型、参数类型顺序决定,由于Web访问的特殊性(只根据参数名匹配参数)所以参数类型顺序不作为匹配的原则。上面的两种情况都是对参数数量的匹配。在FigureController重载方法GetFromQueryStringType
public string GetFromQueryStringType(string x, string y)
public int GetFromQueryStringType(int x, int y)
通过http://localhost:7075/api/Figure/GetFromQueryStringType?x=1&y=2访问。此时会得到"找到了与该请求匹配的多个操作"。
所以仅仅只通过参数类型(参数名相同)进行重载是不行的。
可以作为Action的方法
- 公共的实例方法
- 方法不是继承自ApiController
源码
Github: https://github.com/BarlowDu/WebAPI (API_2)
ASP.NET WebAPI 02-Action的选择(一)的更多相关文章
- ASP.NET WebAPI 10 Action的选择(二)
在本系列的第二篇简要的讲述了Action的选择条件本篇深入讲述一下Action选择的过程在上一篇中我们已经讲到了Controller的激活过程中已经说到了设置Controller的Controller ...
- ASP.NET WebAPI 12 Action的执行
Action的激活大概可以分为如下两个步骤:Action对应方法的调用,执行结果的协商.在WebAPI中由HttpActionInvoker(System.Web.Http.Controllers)进 ...
- 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核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...
- ASP.NET WebApi 文档Swagger中度优化
本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文地址:www.cnblogs.com/tdws 写在前面 在后台接口开发中,接口文档是必不可少的.在复杂的业务当中和多人对接的情况下,简 ...
- 【开源】分享一个前后端分离方案-前端angularjs+requirejs+dhtmlx 后端asp.net webapi
一.前言 半年前左右折腾了一个前后端分离的架子,这几天才想起来翻出来分享给大家.关于前后端分离这个话题大家也谈了很久了,希望我这个实践能对大家有点点帮助,演示和源码都贴在后面. 二.技术架构 这两年a ...
- 前端angularjs+requirejs+dhtmlx 后端asp.net webapi
享一个前后端分离方案源码-前端angularjs+requirejs+dhtmlx 后端asp.net webapi 一.前言 半年前左右折腾了一个前后端分离的架子,这几天才想起来翻出来分享给大家 ...
随机推荐
- Codeforces Round #427 (Div. 2) D dp
D. Palindromic characteristics time limit per test 3 seconds memory limit per test 256 megabytes inp ...
- thinkphp 3.2 部分数据库连贯操作phpstorm helper 文件
<?php class Helper { /** * 用于设置数据写入和查询是否严格检查是否存在字段. * 默认情况下不合法数据字段自动删除,如果设置了严格检查则会抛出异常 * 如: * str ...
- Oracle用imp导入dmp 提示遇到 ORACLE 错误 12560 TNS: 协议适配器错误 解决方法
用imp命令导入dmp文件时提示以下错误: IMP-00058: 遇到 ORACLE 错误 12560 : ORA-12560: TNS: 协议适配器错误 : IMP-00000: 未成功终止导入 : ...
- 【VSCode】Windows下VSCode编译调试c/c++【更新 2018.03.27】
--------– 2018.03.27 更新--------- 便携版已更新,点此获取便携版 已知BUG:中文目录无法正常调试 用于cpptools 0.15.0插件的配置文件更新 新的launch ...
- codevs 1491 取物品
1491 取物品 http://codevs.cn/problem/1491/ 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description 现在有n个物品(有可能 ...
- 数学&搜索:博弈论之极大极小搜索与alpha-beta减枝
目的是寻找最优的方案使得自己能够利益最大化. 基本思想就是假设自己(A)足够聪明,总是能选择最有利于自己的方案,而对手(B)同样足够聪明,总会选择最不利A的方案 对抗搜索就是对于先手来说,取后手中状态 ...
- 引用类型 ( 对象定义 )——Object 类型
本文地址:http://www.cnblogs.com/veinyin/p/7607100.html 创建实例 new 操作符后跟构造函数 var people = new Object(); pe ...
- 浅析 Spring Aop
aop也是Spring里比较重要的一个点,最近把源码看了下,这里总结一下 使用上主要就下面的点注意下: 相关的Annotaion Around Before After AfterReturning ...
- 【leetcode 简单】第九题 移除元素
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成 ...
- Islands and Bridges(POJ2288+状压dp+Hamilton 回路)
题目链接:http://poj.org/problem?id=2288 题目: 题意:求Hamilton 路径权值的最大值,且求出有多少条权值这么大的Hamilton路径. 思路:状压dp,dp[i] ...