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#编程中异常的创建和引发以及异常处理

    详解C#编程中异常的创建和引发以及异常处理 在C#编程中,异常是一种表示在程序执行过程中出现的错误或异常情况的机制。当程序执行期间发生异常时,通常需要采取一些措施来处理这些异常,以避免程序崩溃或产生意外的结果。本文将详细讲解C#编程中异常的创建和引发以及异常处理的完整攻略。 异常的创建和引发 要创建和引发异常,需要执行以下几个步骤: 声明并定义异常类。异常类…

    C# 2023年5月15日
    00
  • C# TextWriter.WriteLineAsync – 异步写入一行字符

    C#中的 TextWriter.WriteLineAsync 方法是一种异步方式将文本写入到 TextWriter 或 StreamWriter 中,并以新的一行结束。这个方法返回一个表示异步写入操作的 Task 对象,我们可以用 await 关键字将异步任务转换为同步任务,等待异步任务完成后再执行下一步操作。 使用这个方法需要进行以下步骤: 创建一个 Te…

    C# 2023年4月19日
    00
  • .Net Core使用Coravel实现任务调度的完整步骤

    .Net Core使用Coravel实现任务调度的完整步骤 Coravel是一个轻量级的任务调度库,可以帮助我们在.Net Core应用程序中实现任务调度。在本文中,我们将介绍如何使用Coravel实现任务调度的完整步骤。 步骤一:安装Coravel 在使用Coravel之前,需要先安装Coravel。可以使用NuGet包管理器安装Coravel。 Inst…

    C# 2023年5月16日
    00
  • 字符串阵列String[]转换为整型阵列Int[]的实例

    将字符串数组String[]转换为整型数组int[]是编程中很常见的操作,我们可以使用Java提供的内置函数进行转换。 以下是转换的完整攻略: 1.遍历字符串数组 首先,我们需要遍历字符串数组String[],并且将每个元素转换为整型。 String[] strArray = {"10", "20", "30…

    C# 2023年6月8日
    00
  • Asp.Net Core 调用第三方Open API查询物流数据的示例

    下面我为您详细讲解 “Asp.Net Core 调用第三方Open API查询物流数据的示例”的完整攻略。 1. 确认使用的 Open API 接口文档 首先,我们需要确认要使用的 Open API 接口文档,以及该文档所提供的查询物流数据的接口信息,包括请求参数和响应数据格式等。通常情况下,我们需要先向物流公司或第三方物流数据服务提供商申请 API 接口权…

    C# 2023年6月3日
    00
  • 轻松学习C#的预定义数据类型

    轻松学习C#的预定义数据类型 什么是预定义数据类型 预定义数据类型是在C#语言中预先定义好的数据类型,通常使用的关键字有int、float、double、char、string等。这些数据类型已经被封装好,可以直接使用,而不需要自己去重新定义。 整型数据类型 整型数据类型用于存储整数。在C#语言中,有4种整型数据类型,分别是byte、short、int和lo…

    C# 2023年6月1日
    00
  • C# dynamic关键字的使用方法

    当我们使用 C# 编程时,有时候我们不清楚某个变量的具体类型,或者需要在运行时动态判断变量类型进行操作,此时就可以使用 dynamic 关键字。dynamic 关键字通常用于动态语言的场景,如脚本语言等,它允许我们实现一些动态的行为。 下面是使用 dynamic 关键字的一些注意事项: 1. dynamic 关键字的使用 使用 dynamic 关键字声明一个…

    C# 2023年5月15日
    00
  • C#影院售票系统毕业设计(4)

    C#影院售票系统毕业设计(4)详细攻略: 需求分析与实现设计 在需求分析中,我们确定了本系统的主要功能:用户注册登录、电影列表、选座购票、订单管理、影院信息查询等。 接着,我们需要对这些功能进行实现设计,可以采用 MVC (Model-View-Controller)架构。 其中,Model负责数据处理、View负责用户界面,Controller负责用户交互…

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