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的方法

  1. 公共的实例方法
  2. 方法不是继承自ApiController

源码

Github: https://github.com/BarlowDu/WebAPI (API_2)

时间: 2024-08-26 02:50:34

ASP.NET WebAPI 02-Action的选择(一)的相关文章

分享一个前后端分离方案源码-前端angularjs+requirejs+dhtmlx 后端asp.net webapi

一.前言 半年前左右折腾了一个前后端分离的架子,这几天才想起来翻出来分享给大家.关于前后端分离这个话题大家也谈了很久了,希望我这个实践能对大家有点点帮助,演示和源码都贴在后面. 二.技术架构 这两年angularjs和reactjs算是比较火的项目了,而我选择angularjs并不是因为它火,而是因它的模块化.双向数据绑定.注入.指令等都是非常适合架构较复杂的前端应用,而且文档是相当的全,碰到问题基本上可以在网上都找到答案.所以前端基本思路就以angularjs为主.代码模块化,通过requir

ASP.NET WebApi 文档Swagger中度优化

本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文地址:www.cnblogs.com/tdws 写在前面 在后台接口开发中,接口文档是必不可少的.在复杂的业务当中和多人对接的情况下,简单的接口文档又不能满足需求,试想你的单应用后台有几十个模块,几百甚至更多的接口,又有上百个ViewModel.怎么能让人用起来更顺手更明了?本篇介绍第一步的中度优化,下一篇将分享下一阶段的深度优化. 第一篇:ASP.NET WebApi 文档Swagger中度优化 1.上手使用 2.Controller

重温ASP.NET WebAPI(二)进阶

介绍 本文为个人对WebApi的回顾无参考价值. 本文内容: Rest和UnitOfWork 创建WebAPi的流程 IOC-Unity的使用 MEF 自定义URL Base认证和Token自定义权限 日志NLog OData的使用 Owin自宿主的使用 代码地址:https://github.com/OtherRuan/Review-Serials WebApi的几点特性 WebApi 提供了几点特性: 1. 自动匹配HTTP方法 GetMethod(), 惯例上会直接匹配Get的http方法

ASP.NET WebAPI 08 Message,HttpConfiguration,DependencyResolver

Message WebAPI作为通信架构必定包含包含请求与响应两个方法上的报文,在WebAPI它们分别是HttpRequestMessage,HttpResponseMessage.对于HttpResponseMessage之前在WebAPI返回结果中有应用. HttpRequestMessage 请求报文包含请求地址(RequestUri),请求方法(Method),头信息(Headers),报文信息(Content)以及Http版本(Versions) public class HttpRe

asp.net webapi 使用小结

一星期前公司用webapi处理一些事情,自己总结一下用法. 1.创建一个空的webapi会默认有一下几个方法. public class ValueController : ApiController { // GET api/value public IEnumerable<string> Get() { return new string[] { "value1", "value2" }; } // GET api/value/5 public st

使用ASP.Net WebAPI构建REST-ful 服务(一)——简单的示例

由于给予REST的Web服务非常简单易用,它越来越成为企业后端服务集成的首选方法.本文这里介绍一下如何通过微软的Asp.Net WebAPI快速构建REST-ful 服务. 首先创建一个Asp.Net Web应用程序(我这里用的是Visual Studio 2013,它已经内置了Web API2). 在出来的模板中选择Empty(空项目),并勾选WebAPI.点击确定后,就创建了一个空的WebAPI服务. 此时只有一个空项目,还没有任何功能,在进行下一步之前,首先我们来看一下REST的基本操作模

asp.net webapi 自托管插件式服务

webapi问世已久,稀里糊涂的人哪它都当mvc来使,毕竟已mvc使用级别的经验就可以应对webapi. webapi和mvc在asp.net5时代合体了,这告诉我们,其实 它俩还是有区别的,要不现在也不会取两个名字,但是由于本人归纳总结能力较差,各种不同也无法一一列出了. 在webapi中 HelpPage是个突出而又实用的东西,它尼玛会把我们code中的注释生成xml,然后以web页面的方式把接口文档展示出来,这尼玛无形就下岗一批文案了,以社会责任感角度来讲,ms的这个HelpPage挺不地

Asp.Net WebApi 集成OWIN架构后,出现 “没有 OWIN 身份验证管理器与此请求相关联” 的解决办法

在Asp.Net WebApi 项目中开启OWIN模块之后,如果没有在OWIN的Startup类中配置认证方式,调用WebApi的相关Controller和Action就会出现如下异常: 出现错误. 没有 OWIN 身份验证管理器与此请求相关联. ExceptionType:System.InvalidOperationException StackTrace: 在 System.Web.Http.Owin.PassiveAuthenticationMessageHandler.Suppress

细说Asp.Net WebAPI消息处理管道

我们在开发完Asp.Net WebAPI程序后,可以使用WebHost寄宿方式或者SelfHost寄宿方式来部署Asp.Net WebAPI.所谓WebHost寄宿就是通过Asp.Net来实现:所谓SelfHost就是可以通过控制台.WinForm.WPF等方式寄宿.下面我们通过简单的例子来看看WebHost方式和SelfHost方式. 该Demo中包含一个类库项目.一个控制台项目以及一个空的WebForm项目.其中类库项目有一个继承自ApiController的名为HomeController