Web API 路由

一、什么是路由?

在计算机网络里,路由就是

路由(routing)就是通过互联的网络把信息从源地址传输到目的地址的活动。

在Web API中意思也类似,就是将网络请求传输给控制器的活动。

路由是 Web API 将 URI 与操作匹配的方式。

二、什么是控制器?

在 ASP.NET Web API 中, 控制器 是处理 HTTP 请求的类。

三、Web API路由模板

APP_Start文件夹下WebApiConfig.cs文件中。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;

namespace ProductsAPP
{
    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 }
            );
        }
    }
}

四、Web API路由选择操作的几种方式

1. 通过匹配操作的谓词前缀来选择操作

假设现已匹配到路由,有控制器代码如下(以下例子来自ASP.NET Web API 中的路由 | Microsoft Docs):

public class ProductsController : ApiController
{
    public IEnumerable<Product> GetAllProducts() { }
    public Product GetProductById(int id) { }
    public HttpResponseMessage DeleteProduct(int id){ }
}

下面是一些可能的 HTTP 请求,以及为每个请求调用的操作:

HTTP 谓词URI 路径操作参数
GETapi/ProductsGetAllProducts* 无 () *
GETapi/Products/4GetProductById4
DELETEapi/Products/4DeleteProduct4
POSTapi/Products* 不 (匹配) *

请注意,URI 的 {id} 段(如果存在)映射到操作的 id 参数。 在此示例中,控制器定义了两个 GET 方法,一个带有 id 参数,另一个不包含参数。
另请注意,POST 请求将失败,因为控制器不定义 " POST … " 方法。

2. 通过显式的指定操作的谓词来选择操作

上面的前缀方式是Web API的基本路由机制,还可以通过特性显式地指定谓词。

public class ProductsController : ApiController
{
    [HttpGet]
    public Product FindProduct(id) {}
}

3. 通过操作名称来选择操作

当通过路由规则能找到多个操作时,以上两种方式不被允许,请求接口后会报如下错误

<Error>
<Message>出现错误。</Message>
<ExceptionMessage>找到了与该请求匹配的多个操作: 类型 ProductsAPP.Controllers.ProductsController 的 Get1 类型 ProductsAPP.Controllers.ProductsController 的 Get2</ExceptionMessage>
<ExceptionType>System.InvalidOperationException</ExceptionType>
<StackTrace> 在 System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext) 在 System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext controllerContext) 在 System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken) 在 System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__15.MoveNext()</StackTrace>
</Error>

此时可通过指定操作名称的方式来选择操作

a. 配置路由模板
routes.MapHttpRoute(
    name: "ActionApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
);
b. 调用时指定操作名称即可

4. 特性路由(属性路由)

a.

将 RoutePrefix 属性添加到控制器。 此属性定义此控制器上所有方法的初始 URI 段。

[RoutePrefix("api/products")]
public class ProductsController : ApiController
{
    // ...
b.

然后将 [Route] 特性添加到控制器操作,如下所示:

[Route("Get1111/{id:int}")]
    public string Get1(int id)
    {
        // ...
c.

http://localhost/api/products/Get1111/1

理解:感觉就是将路由配置信息从WebApiConfig.cs中给拿了出来,使用更加灵活。

五、路由的主要阶段

  • 匹配路由模板的 URI。
  • 选择控制器。
  • 选择操作。

参考

  1. ASP.NET Web API 中的路由 | Microsoft Docs
  2. 路由 - 维基百科,自由的百科全书
  3. ASP.NET Web API 中的路由和操作选择 | Microsoft Docs
  4. C# 特性(Attribute) | 菜鸟教程
  5. ASP.NET Web API 2 中的属性路由 | Microsoft Docs
  6. 使用 ASP.NET Web API 2 中的属性路由创建 REST API | Microsoft Docs
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值