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日

相关文章

  • C#编写COM组件的方法分析

    下面是我对“C#编写COM组件的方法分析”这个话题的一些详细讲解和示例说明。 什么是COM组件 COM(Component Object Model)是微软提供的一种组件对象模型,它是一种面向对象的二进制接口标准,被用于实现跨平台和多语言的组件化编程。COM组件是一种可被重复使用的软件元素,它包含有自己的数据和功能,其他程序可以通过它提供的接口来访问和使用这…

    C# 2023年5月31日
    00
  • C#内置泛型委托之Action委托

    当我们在C#中需要定义一个不带参数且没有返回值的委托时,可以使用Action委托来实现。Action委托是一个内置的泛型委托,用于封装一个无参数且无返回值的方法。 Action委托的语法 下面是Action委托的语法: public delegate void Action(); public delegate void Action<in T>…

    C# 2023年6月1日
    00
  • 如何在C#9 中使用顶级程序 (top-level)

    在C#9中,新增了顶级程序 (top-level) 的特性,使得我们可以更加便捷地编写和运行单个C#的文件。下面是如何使用顶级程序的完整攻略。 创建顶级程序 在C#9中,我们只需要创建一个.cs文件,然后在其中添加代码即可创建一个顶级程序。相比传统的C#程序需要创建类、命名空间等多重结构,顶级程序使用起来更加简单。 using System; Console…

    C# 2023年6月6日
    00
  • C#知识整理

    C#知识整理攻略 一、概述 学习C#语言需要扎实的基础知识,包括数据类型、变量、运算符、控制结构和函数等。接下来,我们将按照主题对C#知识进行整理。同时,我们也会提供一些实际的示例代码帮助大家更好地理解学习C#。 二、数据类型 C#中的数据类型包括整型、浮点型、布尔型和字符型等, 对于每个类型来说,都有其对应的取值范围和存储大小。具体内容介绍如下: 1. 整…

    C# 2023年5月15日
    00
  • C#使用Post调用接口并传递json参数

    下面是关于“C#使用Post调用接口并传递json参数”的完整攻略: 1. 确定请求地址和请求方式 使用Post调用接口需要确定请求地址和请求方式。通常情况下,请求地址是指接口的URL,请求方式是指HTTP请求的方式,即”GET”或”POST”。 2. 导入必要的命名空间 在进行Post调用接口时,需要导入以下两个命名空间: using System.Net…

    C# 2023年5月31日
    00
  • DropDownList绑定选择数据报错提示异常解决方案

    DropdownList是Web开发中常用的下拉列表控件,其可以用于选择一项或多项数据。在使用中,我们经常需要给DropdownList绑定选择数据源,而在绑定数据源过程中可能会遇到一些报错提示,例如“未将对象引用设置到对象的实例”、“不能将Null值分配给int类型的变量”等等。接下来,本文将结合示例,详细说明如何解决这些异常情况。 1. 查看报错信息 在…

    C# 2023年6月1日
    00
  • 如何在 .NET Core WebApi 中处理 MultipartFormDataContent

    最近在对某个后端服务做 .NET Core 升级时,里面使用了多处处理 MultipartFormDataContent 相关内容的代码。这些地方从 .NET Framework 迁移到 .NET Core 之后的代码改动较大,由于本身没有测试覆盖,导致在部署 QA 环境后引发了一些问题。这里做一个技术复盘。 什么是 MultipartFormDataCon…

    C# 2023年4月19日
    00
  • C#前端验证和后台验证代码实例

    下面是关于”C#前端验证和后台验证代码实例”的完整攻略: 前言 在开发Web应用程序时,数据的正确性对整个应用程序的安全具有重要意义。为了提高Web应用程序的健壮性,我们需要在前端和后台分别对用户输入的数据进行验证。本文将演示C#如何通过前端验证和后台验证确保用户输入的数据的准确性。 前端验证 在前端验证中,我们使用JavaScript代码来检查用户输入的数…

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