ASP.NET WebApi 路由配置

时间:2022-06-16 07:18:13

标签:

一、路由介绍

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中。

基于上面两点结论,通过修改路由模板可以满足针对一种资源一种请求方式的多种操作。




2.2 特性路由

特性路由是通过给action打attribute的方式定义路由规则。