asp.net core 属性路由和约定路由的实现

ASP.NET教程 2025-08-27

目录

  • 1. 路由概述
  • 2. 基于属性的路由(Attribute Routing)
    • 2.1 控制器级别的路由
    • 2.2 操作方法级别的路由
    • 2.3 路由参数
  • 3. 约定路由(Convention-Based Routing)
    • 3.1 默认路由配置
    • 3.2 匹配控制器和动作方法
  • 4. 路由的优先级
    • 5. 路由的 HTTP 方法
      • 6. 路由总结

        在ASP.NETCore 中,Web API 中的路由(Route)用于确定客户端请求的 URL 与服务器端处理逻辑之间的映射关系。路由机制在 Web API 的开发中非常重要,它帮助定义和管理不同请求路径如何触发特定的控制器和操作方法。

        1. 路由概述

        路由在 Web API 中有两种主要的映射方式:

        • 基于属性的路由(Attribute Routing):通过在控制器和操作方法上使用路由特性(例如[Route]和[HttpGet])来配置路由规则。
        • 约定路由(Convention-Based Routing):基于约定的方式通过配置在Startup.cs或Program.cs中的路由规则。

        2. 基于属性的路由(Attribute Routing)

        ASP.NETCore Web API 使用属性路由来定义 HTTP 请求与控制器方法之间的映射。通过在控制器和操作方法上添加路由特性,可以直接控制 API 请求如何被路由到特定的控制器和方法。

        2.1 控制器级别的路由

        通过在控制器上使用[Route]特性来定义路由前缀或基路径。所有控制器中的操作方法都会基于这个前缀来创建 URL 路径。

        [Route("api/[controller]")] 
        // 控制器的基础路由 
        public class ProductsController : ControllerBase
        {
            // GET api/products
            [HttpGet]
            public IActionResult GetAllProducts()
            {
                return Ok(new { message = "获取所有产品" });
            }
        
            // GET api/products/{id}
            [HttpGet("{id}")]
            public IActionResult GetProduct(int id) 
            {
                return Ok(new { message = $"获取产品 {id}" });
            }
        }
        • [Route(api/[controller])]会把控制器的路由前缀设置为api/products(假设控制器名称是ProductsController)。
        • [HttpGet({id})]为获取特定产品的方法指定一个带有参数id的 URL 路径。例如,GET api/products/1。

        2.2 操作方法级别的路由

        每个控制器方法可以通过单独的路由特性来指定其对应的 URL 路径和 HTTP 方法。

        [Route("api/[controller]")] 
        public class ProductsController : ControllerBase 
        { 
            [HttpGet] 
            // GET api/products 
            public IActionResult GetAllProducts() 
            { 
                return Ok(new { message = "获取所有产品" }); 
            } 
        
            [HttpGet("{id}")] 
            // GET api/products/{id} 
            public IActionResult GetProduct(int id) 
            { 
                return Ok(new { message = $"获取产品 {id}" }); 
            } 
        
            [HttpPost] 
            // POST api/products 
            public IActionResult CreateProduct([FromBody] Product product) 
            { 
                return CreatedAtAction(nameof(GetProduct), new { id = product.Id }, product); 
            } 
        }
        • [HttpGet({id})]定义了一个带有id参数的 GET 请求,GET api/products/1将会触发该方法。
        • [HttpPost]用于处理 POST 请求,POST api/products会调用CreateProduct方法。

        2.3 路由参数

        • 常规参数:通过{parameterName}来定义路由中的参数。
        • 可选参数:使用?表示路由中的参数是可选的。
        • 约束参数:可以对参数进行约束,例如只接受数字或字符串。
        [Route("api/products/{id:int}")] 
        // 参数 id 必须是整数 
        public IActionResult GetProduct(int id) 
        { 
            return Ok(new { message = $"获取产品 {id}" }); 
        } 
        
        [Route("api/products/{category?}")] 
        // category 是可选参数 
        public IActionResult GetProductsByCategory(string category) 
        { 
            return Ok(new { message = $"获取 {category} 类别的产品" }); 
        }
        • int约束表示id必须是整数。
        • category?表示category是一个可选的查询参数。

        3. 约定路由(Convention-Based Routing)

        ASP.NETCore 也支持通过约定来定义路由,这种方式通常在Program.cs或Startup.cs文件中的MapControllerRoute中配置。

        3.1 默认路由配置

        在Program.cs或Startup.cs中,你可以使用约定路由配置来定义 URL 模式:

        var builder = WebApplication.CreateBuilder(args); 
        builder.Services.AddControllers(); 
        var app = builder.Build(); 
        // 约定路由配置 
        app.MapControllerRoute( name: "default", pattern: "api/{controller}/{action}/{id?}"); 
        app.Run();
        • 这种路由配置会生成类似api/products/Get/1这样的 URL。
        • {controller}会被替换为控制器名称(不包括Controller后缀)。
        • {action}会被替换为方法名称。
        • {id?}是可选的参数。

        3.2 匹配控制器和动作方法

        约定路由的基本配置如下所示:

        [ApiController] 
        [Route("api/[controller]")] 
        public class ProductsController : ControllerBase 
        { 
            [HttpGet("{id?}")] 
            // 默认情况下可以访问此路由 
            public IActionResult GetProduct(int? id) 
            { 
                if (id.HasValue) 
                { 
                    return Ok($"获取产品 ID {id.Value}"); 
                } 
                return Ok("获取所有产品"); 
            } 
        
            [HttpPost] 
            // 对应 POST 请求 
            public IActionResult CreateProduct([FromBody] Product product) 
            { 
                return CreatedAtAction(nameof(GetProduct), new { id = product.Id }, product); 
            } 
        }

        在这种配置下,GET api/products/和GET api/products/{id}都能被映射到GetProduct方法。

        4. 路由的优先级

        当多个路由规则可以匹配同一个请求时,ASP.NETCore 会按照以下顺序匹配路由:

        • 基于属性的路由:先匹配控制器和操作方法上的特性定义的路由。
        • 约定路由:然后会匹配通过约定在Program.cs或Startup.cs中配置的路由。

        需要注意的是,如果存在多个路由规则都可以匹配同一个请求,ASP.NETCore 会选择最具体的路由规则进行匹配。确保路由规则的优先级设置正确是非常重要的。

        5. 路由的 HTTP 方法

        ASP.NETCore 中的路由是通过 HTTP 方法(GET, POST, PUT, DELETE 等)来区分的。例如,可以通过在控制器方法上使用[HttpGet],[HttpPost],[HttpPut]等特性来指定该方法响应的 HTTP 请求类型。

        [Route("api/products")] 
        public class ProductsController : ControllerBase 
        { 
            [HttpGet] 
            // GET api/products 
            public IActionResult GetAllProducts() 
            { 
                return Ok(new { message = "获取所有产品" }); 
            } 
        
            [HttpPost] 
            // POST api/products 
            public IActionResult CreateProduct([FromBody] Product product) 
            { 
                return CreatedAtAction(nameof(GetProduct), new { id = product.Id }, product); 
            } 
        }

        6. 路由总结

        • 基于属性的路由提供了灵活的 URL 定义方式,适合复杂的 API 路径。
        • 约定路由提供了基于控制器和动作方法的默认路由模式,简化了 URL 的配置。
        • 路由参数可以通过路径、查询字符串或请求体传递,支持常规、可选、约束参数等形式。
        • HTTP 方法的特性(如[HttpGet],[HttpPost])用于区分不同类型的请求。

        通过合理地使用路由特性,开发者可以实现对 API 路径、方法、请求类型等的精确控制,提升 Web API 的可维护性和可扩展性。

        到此这篇关于asp.net core 属性路由和约定路由的实现的文章就介绍到这了,更多相关asp.net core 属性路由和约定路由内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

        您可能感兴趣的文章:
        • 详解ASP.NET WEB API 之属性路由
        • ASP.NET Core MVC路由(Routing)的用法
        • ASP.NETCore中的Razor页面实现路由功能
        • ASP.NET Core使用功能开关控制路由访问操作(续)
        • ASP.NET Core使用功能开关控制路由访问操作
        • Asp.net Core 如何设置黑白名单(路由限制)
        • 详解ASP.NET Core端点路由的作用原理
        • ASP.NET Core中自定义路由约束的实现
        • asp.net core webapi项目配置全局路由的方法示例