Web API路由与MVC路由非常类似,最主要的差异在于Web API是使用HTTP Method(GET,POST,PUT,DELETE…)而不是使用URI路径来选择Action。Web API中的路由主要分为默认路由,自定义路由和特性路由。

image

                  图1:Web API

image

                  图2:MVC

默认路由

默认情况下,Web API已经自带一个路由,如下图

1.路由表

当Web API接收到HTTP请求时,它会去尝试比对URI与路由表,如果找到则mapping到相应的action上,如果没有则会抛出404错误。假如我们定义了如下Controller。

image

假如有下面这些请求,看它们是如何匹配的。

image

总结:

①Web API首先会看请求的HTTP方法,然后去找以该HTTP方法名开头的action。

②依约定,我们的方法名最好以HTTP方法名开头,比如 GetAllContacts ()。

自定义路由

1.指定HTTP方法

可以显示指定HTTP方法来代替命名约定,如下代码。

image

2.指定Action

如果使用默认的路由,Web API会依请求的HTTP方法去匹配action。我们也可以使用类似于MVC中的路由(带action),方法是在Web API的路由模板中增加以下代码段。

image

此时,GET api/contact/001和GET api/contact/searchcontactbyid/001都会映射到同一个action,如下图

image

也可以使用特性ActionName来覆写路由模板中的action段,比如,下面有两个action都对应到同一个url,但是一个支持GET方法,另一个支持POST方法,如下图。

image

3.隐藏Action

如果我们不想公开某个action,或者某个action被弃用了,可以使用特性NonAction来标注它即可,如下图。

image

再使用GET api/contact/searchprivatedata/001请求,就会出现404错误。

特性路由(attribute routing)

Web API 2为我们带来了全新的路由方式即特性路由,它使定义URI时更加容易和灵活,同时,它对之前基于命名约定的路由(Web API 1)完全兼容,我们可以在项目中同时使用这两种路由技术。要想使用特性路由有以下步骤。

1.启用特性路由

注:必须使用.net framework 4.5+版本

①调用MapHttpAttributeRoutes方法

image

②更新Global.cs,如下图。

image

2.添加Route特性

在action上添加Route特性,如下图,匹配的url为:GET api/contact/searchcontactbyid/001

image

3.Route前缀

可以在Controller级别添加统一的路由前缀,如下图。

image

4.Route约束

如果我们要严格限制action参数的传递,可以使用Route约束来实现,语法格式为:{parameter:constraint},比如,要限制该action的参数id必须为string类型,我们可以这么做,如下图。

image

GET api/contact/searchcontactbyid/1 匹配

GET api/contact/searchcontactbyid/aaa 404错误

posted on 2015-08-04 14:14  永远的麦子  阅读(673)  评论(0编辑  收藏  举报