.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,根据值创建路由逻辑到具有相同路由前缀的不同控制器的主要内容,如果未能解决你的问题,请参考以下文章