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

.Net Core Web API, create a routing logic to different controllers with same route prefix based on a value

我必须为 .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 的控制器,以上述提供的方式之一捕获状态值并将请求重定向到相关控制器,但我想避免重定向并实现这是路由级别。你们能不能提供一个更好的方法来做到这一点。

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

[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,则将其包含在路由模板中。

参考Routing to controller actions in ASP.NET Core

引用Routing in ASP.NET Core

您可以使用 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 命名指南。