当前位置:首页 > Windows程序 > 正文

Action的选择(一)

2021-03-26 Windows程序

在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进行访问:

:7075/api/Figure

:7075/api/Figure?firstName=Bran

此时他们调用的方法分别是GetAll, GetByQueryString

另外在FigureController再加一个无参无返回值的Get方法,现在再用:7075/api/Figure访问就会得到"找到了与该请求匹配的多个操作"的错误消息

参数匹配

在.NET中方法可以重载,所以在Action的选择中也会有对参数的匹配过程。参数的来源于RouteData与QueryString。在匹配中,会出现以下几种情况(为了在):

1.所有参数无默认值

这种情况下就会对所有参数进行匹配,如下:

public Figure GetFromQueryString(string firstName)

public Figure GetFromQueryString(string firstName,string lastName)

用以下Url进行访问

:7075/api/Figure/GetByQueryString?firstName=Bran

:7075/api/Figure/GetByQueryString?firstName=Bran&lastName=Stack

分别调用的是GetFromQueryString(string firstName), GetFromQueryString(string firstName,string lastName。

但我们使用:7075/api/Figure/GetByQueryString进行访问,会返回"404 Not FOUND"。

2.存在默认只参数

首先可以确认的是,优先进行所有参数进行匹配,如果没有匹配的Action再进行二轮匹配

public IEnumerable< Figure> GetFromQueryStringDefaultValue(string lastName="Stack")

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/67956.html