Web API路由与MVC路由非常类似,最主要的差异在于Web API是使用HTTP Method(GET,POST,PUT,DELETE…)而不是使用URI路径来选择Action。Web API中的路由主要分为默认路由,自定义路由和特性路由。
图1:Web API
图2:MVC
默认路由
默认情况下,Web API已经自带一个路由,如下图
1.路由表
当Web API接收到HTTP请求时,它会去尝试比对URI与路由表,如果找到则mapping到相应的action上,如果没有则会抛出404错误。假如我们定义了如下Controller。
假如有下面这些请求,看它们是如何匹配的。
总结:
①Web API首先会看请求的HTTP方法,然后去找以该HTTP方法名开头的action。
②依约定,我们的方法名最好以HTTP方法名开头,比如 GetAllContacts ()。
自定义路由
1.指定HTTP方法
可以显示指定HTTP方法来代替命名约定,如下代码。
2.指定Action
如果使用默认的路由,Web API会依请求的HTTP方法去匹配action。我们也可以使用类似于MVC中的路由(带action),方法是在Web API的路由模板中增加以下代码段。
此时,GET api/contact/001和GET api/contact/searchcontactbyid/001都会映射到同一个action,如下图
也可以使用特性ActionName来覆写路由模板中的action段,比如,下面有两个action都对应到同一个url,但是一个支持GET方法,另一个支持POST方法,如下图。
3.隐藏Action
如果我们不想公开某个action,或者某个action被弃用了,可以使用特性NonAction来标注它即可,如下图。
再使用GET api/contact/searchprivatedata/001请求,就会出现404错误。
特性路由(attribute routing)
Web API 2为我们带来了全新的路由方式即特性路由,它使定义URI时更加容易和灵活,同时,它对之前基于命名约定的路由(Web API 1)完全兼容,我们可以在项目中同时使用这两种路由技术。要想使用特性路由有以下步骤。
1.启用特性路由
注:必须使用.net framework 4.5+版本
①调用MapHttpAttributeRoutes方法
②更新Global.cs,如下图。
2.添加Route特性
在action上添加Route特性,如下图,匹配的url为:GET api/contact/searchcontactbyid/001
3.Route前缀
可以在Controller级别添加统一的路由前缀,如下图。
4.Route约束
如果我们要严格限制action参数的传递,可以使用Route约束来实现,语法格式为:{parameter:constraint},比如,要限制该action的参数id必须为string类型,我们可以这么做,如下图。
GET api/contact/searchcontactbyid/1 匹配
GET api/contact/searchcontactbyid/aaa 404错误