.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 链接