ASP中不寻常的[RoutePrefix]行为净之前
本文关键字:RoutePrefix 不寻常 ASP | 更新日期: 2023-09-27 18:08:03
我有两个控制器如下:
[RoutePrefix("v1/user/something")]
public class SomethingsController : ApiController
{
[Route("{id}")]
[HttpGet]
[ResponseType(typeof(SomethingsViewModel))]
public async Task<IHttpActionResult> GetAsync([FromUri]int id)
{
}
}
[RoutePrefix("v1/user")]
public class UserController : ApiController
{
[Route("{id}")]
[HttpGet]
[Authorize(Roles = "Super Admin")]
public async Task<IHttpActionResult> GetByIdAsync([FromUri]int id)
{
}
}
现在通过查看上面的代码,我认为正在创建以下两个路由:- v1/user/一些/{id}
- v1/user/{id}
但不幸的是,由于某种原因,情况并非如此。当尝试访问上述路由之一时,我一直得到以下异常消息:
找到多个与URL匹配的控制器类型。如果多个控制器上的属性路由与请求的URL匹配,就会发生这种情况。这个请求已经找到了以下匹配的控制器类型:用户控件,MyProject.Api.Controllers.SomethingsController
请帮助我找出我可能做错了什么,或者我在这里遗漏了哪个小细节。
虽然它们的路由前缀不同,但它们的解析路由是匹配的。例如,v1/user/{id}
将匹配v1/user/something/{id}
,其中id
参数arg在第一条路由中将采用something/{id}
。
路由前缀和路由属性组合在一起创建一个完整的路由,并添加到路由表中。
在这种情况下,你需要使用约束来更好地区分路由。
[RoutePrefix("v1/user/something")]
public class SomethingsController : ApiController {
[Route("{id:int}")]
[HttpGet]
[ResponseType(typeof(SomethingsViewModel))]
public async Task<IHttpActionResult> GetAsync([FromUri]int id) { ... }
}
[RoutePrefix("v1/user")]
public class UserController : ApiController {
[Route("{id:int}")]
[HttpGet]
[Authorize(Roles = "Super Admin")]
public async Task<IHttpActionResult> GetByIdAsync([FromUri]int id) { ... }
}
现在int
约束下的something
不会被误认为是UserController.GetByIdAsync
动作的有效参数
<路径约束/strong>
路由约束允许你限制路由中的参数模板匹配。一般的语法是"{parameter:constraint}"。例如:
[Route("users/{id:int}"] public User GetUserById(int id) { ... } [Route("users/{name}"] public User GetUserByName(string name) { ... }
在这里,第一条路由只会被选中,如果"id"段是URI是一个整数。否则,将选择第二条路线。