.Net核心Web API,根据值创建到具有相同路由前缀的不同控制器的路由逻辑
我必须为.Net Core 3.0 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
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
}
}
}