C# WebApi 路由机制剖析

这里详细讲解一下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日

相关文章

  • ASP.NET Core使用EF保存数据、级联删除和事务使用

    ASP.NET Core是一个开源的Web框架,支持多种平台,包括Windows、macOS和Linux等。在ASP.NET Core中,使用Entity Framework(EF)来操作数据库,可以很方便地进行数据的增删改查等操作。本文将详细介绍ASP.NET Core使用EF保存数据、级联删除和事务使用的完整攻略,同时附带两个示例说明。 一、ASP.NE…

    C# 2023年6月3日
    00
  • C#实现输入法功能详解

    C#实现输入法功能详解 输入法是一种计算机应用程序,它是用来帮助用户通过键盘输入字符、符号和单词的工具。在本文中,我们将会详细讲解如何使用C#实现输入法功能。 输入法基础知识 输入法主要包括两个方面,一个是输入法编辑器,它主要用于用户输入;另一个是输入法引擎,它主要用于将用户的输入转换成相应的文字。 输入法编辑器:输入法编辑器是一种输入控件,它类似于文本框,…

    C# 2023年6月1日
    00
  • javascript与asp.net(c#)互相调用方法

    为了实现JavaScript与ASP.NET(C#)互相调用方法,我们可以通过以下两种方法来实现: 使用Ajax调用Web API 以上方法适用于在前端JavaScript中调用后端C#方法。 首先,你需要创建一个Web API控制器,以便在后台中实现一些C#方法,然后该控制器将返回JSON数据。这些方法可以使用C#类库、数据库连接、Entity Frame…

    C# 2023年6月3日
    00
  • 浅谈C#中ToString()和Convert.ToString()的区别

    有关C#语言中的数据类型转换,ToString() 和 Convert.ToString() 都是常用的方法,它们有很多相似之处,但也有一些区别。本文将详细讲解其区别,供大家参考。 ToString()方法 ToString() 是一个用于将对象转换为字符串的方法。它可以用于常见的数据类型,如整数、浮点数、Boolean 等,但必须在该数据类型的上下文中使用…

    C# 2023年5月15日
    00
  • 教你如何用C#制作文字转换成声音程序

    教你如何用C#制作文字转换成声音程序 前言 随着人工智能的发展,语音技术的应用越来越广泛,其中一项核心技术就是文字转语音。本文将教你如何用C#制作一个文字转语音程序。 准备工作 在开始编写代码之前,我们需要安装.NET框架(如果还未安装的话),推荐安装.NET Framework 4.0及以上版本。 下载地址:https://dotnet.microsoft…

    C# 2023年6月6日
    00
  • 在.NET Core类库中使用EF Core迁移数据库到SQL Server的方法

    在 .NET Core 类库中使用 EF Core 迁移数据库到 SQL Server 的方法 在 .NET Core 类库中使用 EF Core 迁移数据库到 SQL Server 是一种常见的操作。本攻略将介绍如何在 .NET Core 类库中使用 EF Core 迁移数据库到 SQL Server。 步骤 以下是在 .NET Core 类库中使用 EF…

    C# 2023年5月17日
    00
  • Asp.net(C#)读取数据库并生成JS文件制作首页图片切换效果(附demo源码下载)

    题目中所提到的“Asp.net(C#)读取数据库并生成JS文件制作首页图片切换效果(附demo源码下载)”借鉴了服务器端动态生成JavaScript的方法,如下所述: 准备工作 首先,确保你的电脑上安装了Visual Studio和SQL Server数据库管理系统。 其次,在Visual Studio中创建一个名为“ImageSwitcher”的Web应用…

    C# 2023年5月31日
    00
  • C#正则表达式Regex用法详解

    C#正则表达式Regex用法详解 正则表达式是一种可以用来匹配文本和字符串的较为高效的方式,C# 提供了 Regex 类库来支持正则表达式。本文将给出 C# 中使用 Regex 类库的详细用法。 构造函数 Regex 类有多个构造函数,可以接受不同数量和类型的参数,例如: //默认构造函数 Regex regex = new Regex(@"\d+…

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