C# WebApi 路由机制剖析

yizhihongxing

这里详细讲解一下C# WebApi路由机制。

什么是C#WebApi路由机制

在C# WebApi中,路由机制(Route mechanism)是指当客户端发送一个HTTP请求到服务端时,系统如何根据请求的URL和HTTP方法来匹配对应的API方法。这个过程就是通过路由机制来实现的。路由机制可以将请求URL和HTTP方法映射到相应的API方法。

路由的两种类型

在C# WebApi中,路由分为两种类型,分别是传统路由(traditional routes)和特性路由(attribute routing)。

传统路由

传统路由将URL分解成受控制器和动作组成的一组段。这些控制器和操作可以由您自己的代码(即您的路由)映射到名称,而该代码是在WebApi应用程序启动时执行的。传统路由的示例:

config.Routes.MapHttpRoute(
   name: "DefaultApi",
   routeTemplate: "api/{controller}/{id}",
   defaults: new { id = RouteParameter.Optional });

路由计算包括以下步骤:

  • 检索实现 IHttpControllerSelector 的默认策略对象 (HttpControllerSelector)。
  • 选择适合于请求的控制器类型。
  • 实例化控制器并调用操作。
  • 构建响应并将其发送给客户端。

传统路由的优点是可与 ASP.NET Web Forms 和 MVC 共享,并且不依赖于 ASP.NET Web API。但是,传统路由需要硬编码控制器和操作名称,因此不太灵活。

特性路由

WebApi 2 引入了特性路由,它提供了一种使用属性而不是在路由表中定义路由的方式。这使得 API 代码变得更加直观,因为它将路由信息与 API 方法直接挂接到了一起。

特性路由的示例:

[RoutePrefix("api/employees")]
public class EmployeesController : ApiController
{
   [HttpGet]
   [Route("getall")]
   public IHttpActionResult GetAllEmployees()
   {
       return Ok();
   }

   [HttpPost]
   [Route("create")]
   public IHttpActionResult CreateEmployee(Employee employee)
   {
       return Ok();
   }
}

在上述示例中,RoutePrefix 指示了控制器的路由前缀,这意味着有关控制器的所有Route属性都将在此前缀之后匹配。Route属性指示了API方法的具体路由,这些路由会与控制器的路由前缀连接,从而形成完整的路由。

C#WebApi路由的优势

  • 灵活性:Web API Routing 允许 Web API 应用程序轻松更改 URI 格式,而无需更改应用程序中的其他代码,因为 Web API 很好地隐藏了 URI 格式。

  • 可扩展性:Web API Routing 允许您添加自定义路由规则以控制请求到 API 操作的映射。这种可扩展性使您能够编写可重用,复杂和多样化的 Web API 应用程序。

  • 自定义URI格式:Web API Routing 允许 API 操作映射到任何 URI 格式,这使得您可以为 API 开发自己的 URI 格式。

示例1:传统路由

例如,我们可以定义以下 API:

public class ProductsController : ApiController {
   public IEnumerable<Product> GetAllProducts() { ... }
   public Product GetProductById(int id) { ... }
   public IEnumerable<Product> GetProductsByCategory(string category) { ... }
   public HttpResponseMessage UpdateProduct(Product product) { ... }
   public void DeleteProductById(int id) { ... }
}

我们可以使用以下路由配置来映射请求:

// routes for the products api
config.Routes.MapHttpRoute(
   name: "ProductsApi",
   routeTemplate: "api/products/{id}",
   defaults: new { controller = "products", id = RouteParameter.Optional }
);

config.Routes.MapHttpRoute(
   name: "ProductsByCategoryApi",
   routeTemplate: "api/products/category/{category}",
   defaults: new { controller = "products", action = "getproductsbycategory" }
);

config.Routes.MapHttpRoute(
   name: "UpdateProductApi",
   routeTemplate: "api/products/{id}",
   defaults: new { controller = "products", action = "updateproduct" },
   constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Put) }
);

config.Routes.MapHttpRoute(
   name: "DeleteProductApi",
   routeTemplate: "api/products/{id}",
   defaults: new { controller = "products", action = "deleteproductbyid" },
   constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Delete) }
);
  • 请求 api/products 将映射到 GetAllProducts 操作。
  • 请求 api/products/{id} 将映射到 GetProductById 操作,并且 id 参数将在 URL 中作为路由段。
  • 请求 api/products/category/{category} 将映射到 GetProductsByCategory 操作,并且 category 参数将在 URL 中作为路由段。
  • 请求 api/products/{id} 且带有 PUT 请求方法将映射到 UpdateProduct 操作。
  • 请求 api/products/{id} 且带有 DELETE 请求方法将映射到 DeleteProductById 操作。

示例2:特性路由

我们重新定义相同的 API,使用特性路由法:

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

   [HttpGet]
   [Route("")]
   public IEnumerable<Product> GetAllProducts() { ... }

   [HttpGet]
   [Route("{id:int}")]
   public Product GetProductById(int id) { ... }

   [HttpGet]
   [Route("category/{category}")]
   public IEnumerable<Product> GetProductsByCategory(string category) { ... }

   [HttpPut]
   [Route("{id:int}")]
   public HttpResponseMessage UpdateProduct(Product product) { ... }

   [HttpDelete]
   [Route("{id:int}")]
   public void DeleteProductById(int id) { ... }
}
  • [RoutePrefix("api/products")] 属性指示了控制器的路由前缀,所有方法的路由都将在此前缀之后匹配。
  • [Route("")] 属性指示映射到 GetAllProducts 操作的路由。
  • [Route("{id:int}")] 属性指示映射到 GetProductById 操作的路由。其中,{id:int} 表示该路由段应为整数类型。
  • [Route("category/{category}")] 属性指示映射到 GetProductsByCategory 操作的路由。
  • [Route("{id:int}")][HttpPut] 属性指示映射到 UpdateProduct 操作的路由和请求方法。
  • [Route("{id:int}")][HttpDelete] 属性指示映射到 DeleteProductById 操作的路由和请求方法。

这是特性路由的一个例子。通过使用属性路由,可以更清晰地表达每个 Controller 和 Action,使代码更加直观易懂。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# WebApi 路由机制剖析 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • C#基础知识之FileStream

    C#基础知识之FileStream 什么是FileStream? 在C#中,FileStream是操作文件的一个类。通过FileStream,可以对一个文件进行读取、写入、修改等操作。在进行文件处理时,FileStream是一个非常重要的工具。 FileStream的基本用法 创建FileStream对象时,会需要传递文件的路径、文件打开方式等参数。常见的打…

    C# 2023年5月15日
    00
  • ASP.NET Core 6最小API中使用日志和DI示例详解

    ASP.NET Core 6最小API中使用日志和DI示例详解 在ASP.NET Core 6中,最小API是一种轻量级的方式来构建Web API。在本攻略中,我们将介绍如何在ASP.NET Core 6最小API中使用日志和DI。以下是ASP.NET Core 6最小API中使用日志和DI示例详解的完整攻略: 步骤一:创建最小API 首先,需要创建一个最小…

    C# 2023年5月17日
    00
  • 基于C#实现乱码视频效果

    基于C#实现乱码视频效果攻略 背景介绍 乱码视频是一种通过修改视频文件的二进制数据来实现的视频效果,看起来像是视频画面出现了故障、损坏或者失真。这种效果在一些电影、音乐视频和MV中经常被使用,可以让视频更具有艺术感和实验性。本文将介绍如何使用C#编程语言实现乱码视频效果。 实现步骤 了解乱码视频的原理和实现方式:乱码视频通过修改视频文件的二进制数据,使视频画…

    C# 2023年6月6日
    00
  • C# Winform 实现屏蔽键盘的win和alt+F4的实现代码

    首先,需要在C# Winform程序的窗体类中重载WndProc方法,并且引用System.Windows.Forms命名空间。在WndProc方法中,可以通过重写系统消息 WM_HOTKEY,来监听并屏蔽键盘按键事件,实现屏蔽win和alt+F4的功能。 具体实现步骤如下: 1.引用命名空间 System.Windows.Forms: using Syst…

    C# 2023年6月6日
    00
  • c#继承中的函数调用实例

    下面是针对”C#继承中的函数调用实例”的完整攻略: 概述 在C#中,继承是一种非常常见的实现代码重用和减少冗余的方式。在子类中可以重写父类中的方法,也可以从父类中继承方法。当子类继承父类的方法时,可能会出现相同名称的方法,因此在调用方法时要注意调用哪个方法。这里就介绍在继承中如何调用不同层次的方法。 基本概念 在C#中,继承是一种创建新类的机制,新类可以继承…

    C# 2023年6月8日
    00
  • 使用C#调用百度地图并实现坐标点的设置以及读取示例

    以下是使用C#调用百度地图并实现坐标点的设置以及读取的完整攻略。 准备工作 首先,我们需要在百度地图开放平台上申请一个API Key,用于调用地图API。在申请API Key时需要选择 “浏览器端”类型。申请成功后,将API Key保存下来备用。 调用百度地图API C#调用百度地图的基本思路是通过网络请求获取到百度地图的返回数据,然后进行解析、处理。具体流…

    C# 2023年5月15日
    00
  • C#实现将数据导出到word或者Excel中的方法

    下面是详细讲解C#实现将数据导出到word或者Excel中的方法的完整攻略。 导出数据到Excel 安装NPOI 使用NPOI实现将数据导出到Excel,首先需要安装NPOI。可以使用NuGet来安装,打开Visual Studio,右键项目,选择“管理 NuGet 程序包”,在搜索框中输入“NPOI”,选择官方版本进行安装。 创建工作簿和工作表 在项目中添…

    C# 2023年5月15日
    00
  • C#单例类的实现方法

    C# 单例类是一种设计模式,用于保证一个类始终只有一个实例,这对于某些场景非常有用。下面是单例类的实现方法。 使用私有构造函数和静态变量 这是最常见的单例类实现方法,具体实现步骤如下: 创建类并声明一个私有构造函数,以防止外界直接创建该类的实例。 在类中定义一个静态变量,用于存储唯一的实例。 提供一个公共静态方法,返回唯一的实例。 在公共静态方法中判断静态变…

    C# 2023年6月6日
    00
合作推广
合作推广
分享本页
返回顶部