[英]Unusual [RoutePrefix] behavior in ASP.NET WebAPI
我有两个控制器,如下所示:
[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)
{
}
}
现在,通过查看上面的代码,我认为正在创建以下两条路线:
但是不幸的是,由于某种原因,事实并非如此。 尝试访问上述路由之一时,我始终收到以下异常消息:
找到与URL匹配的多种控制器类型。 如果多个控制器上的属性路由与请求的URL匹配,则会发生这种情况。 该请求找到了以下匹配的控制器类型:MyProject.Api.Controllers.UserController,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
行动
ASP.NET Web API 2中的参考属性路由:路由约束
路线约束
路由约束使您可以限制路由模板中参数的匹配方式。 通用语法为“ {parameter:constraint}”。 例如:
[Route("users/{id:int}"] public User GetUserById(int id) { ... } [Route("users/{name}"] public User GetUserByName(string name) { ... }
在此,只有在URI的“ id”段为整数的情况下才选择第一个路由。 否则,将选择第二条路线。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.