标签:
一、路由介绍ASP.NET Web API路由是整个API的入口。我们访问某个资源就是通过路由映射找到对应资源的URL。通过URL来获取资源的。
对于ASP.NET Web API内部实现来讲,我们的请求最终将定位到一个具体的Action上。所以说,ASP.NET Web API路由就是把客户端请求映射到对应的Action上的过程。
二、两种路由模式 2.1 模板路由模板路由是ASP.NET Web API默认提供的路由。下面我们就简单讲解此中路由的用法。
默认模板路由
模板路由使用前需要定义路由模板。如下面默认的路由模板:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http; namespace Supernova.Webapi { public static class WebApiConfig { 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 } ); } } }
此模板路由是新建项目默认生成的,在App_Start文件夹下。
我们可以看到此模板的URL格式是api/{controller}/{id}。api代表在资源前面要带上api目录,controller代表请求资源的控制器名称。id代表一条资源的id,id 是可选的。这种默认的模板是不带action的,所以它是以请求方式来区分资源的,我们必须在action上添加请求方式特性加以区分。
1.我们添加一个测试控制器api。
public class TestController : ApiController { public object Get1() { return "d1"; } }
用fiddldr调试如下:
2.我们添加两个方法如下:
public class TestController : ApiController { public object Get1() { return "d1"; } public object Get2() { return "d2"; } }
我们再用fiddler调试如下:
错误信息是:
{"Message":"出现错误。","ExceptionMessage":"找到了与该请求匹配的多个操作: \r\n类型 Supernova.Webapi.Controllers.TestController 的 Get1\r\n类型 Supernova.Webapi.Controllers.TestController 的 Get2","ExceptionType":"System.InvalidOperationException","StackTrace":" 在 System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext)\r\n 在 System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)\r\n 在 System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()"}
我们将代码改为如下:
public class TestController : ApiController { public object Get1() { return "d1"; } [HttpPost] public object Get2() { return "d2"; } }
调试返回Get1的信息。
从上面两个测试我们可以得出如下结论:
action的默认请求方式是HttpGet。
当多个action的 请求方式一样的话,在默认路由模板下(没有action),将会匹配多个操作。
基于上面两点结论,,默认路由模板无法满足针对一种资源一种请求方式的多种操作(比如修改操作,可能针对不同的字段进行修改)。
定制模板路由
我们重新定制模板路由,如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http; namespace Supernova.Webapi { public static class WebApiConfig { public static void Register(HttpConfiguration config) { // Web API 配置和服务 // Web API 路由 config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } ); } } }
从上面我们可以看出,在默认路由的基础上,我们队路由模板增加了一级action。
测试api如下:
public class TestController : ApiController { public object Get1() { return "d1"; } public object Get2() { return "d2"; } }
我们再通过访问,返回404,如图:
我们通过访问,结果正确,如图:
我们通过访问,结果正确,如图:
通过定制路由模板我们可以得出如下结论:
通过在路由模板中增加action目录,对资源的定位直接作用到action上。
多个HttpGet方法可以共存于一个controller中。
基于上面两点结论,通过修改路由模板可以满足针对一种资源一种请求方式的多种操作。
特性路由是通过给action打attribute的方式定义路由规则。