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

.Net核心Web API,根据值创建到具有相同路由前缀的不同控制器的路由逻辑,.net,.net-core,asp.net-core-webapi,asp.net-core-routing,.net,.net Core,Asp.net Core Webapi,Asp.net Core Routing,我必须为.Net Core 3.0 Web API项目创建一个路由逻辑,该项目使用给定值的相同路由前缀路由到不同的控制器 例如: 我有基于状态的控制器 StateUsersCOController StateUsersCAController StateUsersWAController 诸如此类 它们都实现了相同的方法,例如: GetUsers(); 我希望实现的是根据状态信息将请求路由到相关控制器,例如: api/StateUsers/CA 或 或 我能想到的是创建一个名为StateU

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

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

StateUsersCOController
StateUsersCAController
StateUsersWAController
诸如此类

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

GetUsers();
我希望实现的是根据状态信息将请求路由到相关控制器,例如:

api/StateUsers/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
,则将其包含在rout模板中

参考文献


参考

您可以使用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
        }
    }
}
命名空间控制器
{
[ApiController]
[路由(“api/stateusers”)]
公共类StateUsersController:ControllerBase
{
public StateUsersController()
{
}
//获取api/stateusers/getusers/{state}
[HttpGet]
[路由(“getusers/{state}”)]
公共异步任务GetUsers(字符串状态)
{
//实现你的逻辑
}
//或
//获取api/stateusers/{state}
[HttpGet]
[路由(“{state}”)]
公共异步任务GetUsersByState(字符串状态)
{
//实现你的逻辑
}
}
}

注意:我建议您查看以下网站,在那里您可以查看RESTful API命名指南。

您会传递多个参数吗?不只是单个状态参数您可以尝试类似于@Eldar的方法尝试链接中给出的解决方案,尽管看起来很有希望,我正在使用APIController属性,它需要覆盖常规路由的路由属性。从URL中删除了操作方法名称,这个答案似乎是最简单、最方便的,因为我尝试过类似的方法,但我使用的是apicontroller属性,它需要使用route属性。根据不同的状态使用不同的控制器是此任务的一个困难要求。
[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() {
        //...
    }
}
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
        }
    }
}