之前我们说过 Web MVC 中的路由,本篇,我们看看如何配置 Web API 路由。
Web API 路由类似于 ASP.NET MVC 路由。它将传入的 HTTP 请求路由到 Web API Controller 上的特定 Action 方法。
Web API 支持两种方式的路由: 
- 基于约定的路由(Convention-Based Routing)
 
- 特性路由(Attribute Routing)
 
基于约定的路由
在基于约定的路由中,Web API 使用路由模板来确定要执行的 Controller 和 Action 方法。必须至少将一个路由模板添加到路由表中才能处理各种 HTTP 请求。
public static class WebApiConfig {     public static void Register(HttpConfiguration config)     {                  config.MapHttpAttributeRoutes();                           config.Routes.MapHttpRoute(             name: "DefaultApi",             routeTemplate: "api/{controller}/{id}",             defaults: new { id = RouteParameter.Optional }         );     } }
 
  | 
 
上面的 config.MapHttpAttributeRoutes() 方法作用是启用特性路由。
config.Routes 是 HttpRouteCollection 类型的路由表或路由集合,使用 MapHttpRoute() 扩展方法在路由表中添加 DefaultApi 路由。
可以创建 IHttpRoute 实例并手动将其添加到集合中,如下: 
 IHttpRoute defaultRoute = config.Routes.CreateRoute("api/{controller}/{id}",                                              new { id = RouteParameter.Optional }, null);
  config.Routes.Add("DefaultApi", defaultRoute);
 
  | 
 
如果 Web API 框架找不到传入请求的匹配路由,同 Web MVC 一样,将发送 404 错误响应。
注意: Web API 还支持与 ASP.NET MVC 相同的路由,在 URL 中包含 Action 方法名称。
多路由
可以使用 HttpConfiguration 对象在 Web API 中配置多个路由: 
public static class WebApiConfig {     public static void Register(HttpConfiguration config)     {         config.MapHttpAttributeRoutes();                       config.Routes.MapHttpRoute(             name: "Foo",             routeTemplate: "api/foo/{id}",             defaults: new { controller="foo", id = RouteParameter.Optional }             constraints: new { id ="/d+" }         );
                           config.Routes.MapHttpRoute(             name: "DefaultApi",             routeTemplate: "api/{controller}/{id}",             defaults: new { id = RouteParameter.Optional }         );     } }
 
  | 
 
我们在 DefaultApi 路由之前配置了 Foo 路由。因此,任何传入的请求将首先与 Foo 路由匹配,如果不匹配,则再与 DefaultApi 路由进行匹配。
注意: 在路由模板中使用 api 的原因只是为了避免 MVC 控制器和 Web API 控制器混淆。
特性路由
Web API 2 支持特性路由。顾名思义,属性路由使用[Route()]特性来定义路由。该特性可以应用于任何 Controller 或 Action 方法。
要使用 Web API 进行特性路由,必须通过调用 config.MapHttpAttributeRoutes() 方法在 WebApiConfig 中启用它。
public class FooController : ApiController {     [Route("api/foo/bars")]     public IEnumerable<string> Get()     {         return new string[] { "bar1", "bar2" };     } }
 
  | 
 
则我们通过 http://localhost:1234/api/foo/bars 访问上面的 Get 方法。