.Net Core Web API,根据值创建路由逻辑到具有相同路由前缀的不同控制器

Posted

技术标签:

【中文标题】.Net Core Web API,根据值创建路由逻辑到具有相同路由前缀的不同控制器【英文标题】:.Net Core Web API, create a routing logic to different controllers with same route prefix based on a value 【发布时间】:2020-11-26 13:26:11 【问题描述】:

我必须为 .Net Core 3.0 Web API 项目创建路由逻辑,该项目路由到具有相同路由前缀的不同控制器,给定一个值。

示例: 我有基于状态的控制器。

StateUsersCOController
StateUsersCAController
StateUsersWAController

等等。

它们都实现了相同的方法,例如:

GetUsers();

我想要实现的是根据状态信息将我的请求路由到相关控制器,例如:

api/StateUsers/CA

api/StateUsers?state=CA

api/StateUsers and Request Header has the state Information such as State:CA

我能想到的是创建一个名为 StateUsers 的控制器,以上述提供的方式之一捕获状态值并将请求重定向到相关控制器,但我想避免重定向并实现路由级别。你们能不能提供一个更好的方法来做到这一点。

【问题讨论】:

你会传递多个参数吗? 没有唯一的单一状态参数 你可以尝试类似this @Eldar 尝试了链接中给出的解决方案,虽然看起来很有希望,但我使用的是 APIController 属性,它需要覆盖传统路由的 Route 属性。 【参考方案1】:

具有固定路由模板的属性路由应该能够唯一区分控制器

[ApiController]
[Route("api/StateUsers/CO")]
public class StateUsersCOController : Controller 
    //GET api/StateUsers/CO
    [HttpGet]
    public IActionResult GetUsers() 
        //...
    


[ApiController]
[Route("api/StateUsers/CA")]
public class StateUsersCAController : Controller 
    //GET api/StateUsers/CA
    [HttpGet]
    public IActionResult GetUsers() 
        //...
    


[ApiController]
[Route("api/StateUsers/WA")]
public class StateUsersWAController : Controller 
    //GET api/StateUsers/WA
    [HttpGet]
    public IActionResult GetUsers() 
        //...
    

注意从路由中删除 GetUsers 以允许更简化的 RESTFul URL。

如果您坚持在 URL 中包含 GetUsers,则将其包含在 rout 模板中。

参考Routing to controller actions in ASP.NET Core

参考Routing in ASP.NET Core

【讨论】:

从 URL 中删除了 Action 方法名称,这个答案似乎是最简单和最方便的,因为我尝试过类似 strathweb.com/2019/08/… 的东西,但我使用的是 apicontroller 属性,它需要使用 route 属性。 【参考方案2】:

您可以使用 route 属性为其定义路由,据我了解,您不想拥有 3 个不同的控制器以避免代码重复,因此您可以尝试以下操作:

namespace Controllers

    [ApiController]
    [Route("api/stateusers")]
    public class StateUsersController : ControllerBase
    
        public StateUsersController()
        
        

        // GET api/stateusers/getusers/state
        [HttpGet]
        [Route("getusers/state")]
        public async Task<IActionResult> GetUsers(string state)
        
            //Implement your logic
        
        
        //Or
        
        // GET api/stateusers/state
        [HttpGet]
        [Route("state")]
        public async Task<IActionResult> GetUsersByState(string state)
        
            //Implement your logic
        
    

注意:我建议您查看以下网站 REST Resource Naming Guide,您可以在其中查看 RESTful API 命名指南。

【讨论】:

根据不同的状态使用不同的控制器是这个任务的硬性要求。

以上是关于.Net Core Web API,根据值创建路由逻辑到具有相同路由前缀的不同控制器的主要内容,如果未能解决你的问题,请参考以下文章

将 Swashbuckle 添加到 .NET Core Web API 应用程序后,访问版本化路由会返回 404

将中间件附加到 ASP.NET Core Web API 中的特定路由?

使用 ASP.NET Core MVC 创建 Web API

使用路由值在 .net core api 中生成 url 链接

ASP.NET Core,以查询字符串为模板的 Web API RouteAttribute

如何从 ASP.NET Core Web API 中的 SQL Server 存储过程中获取返回值