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

请帮助我找出我可能做错了什么,或者我在这里遗漏了哪个小细节。

ASP中不寻常的[RoutePrefix]行为净之前

虽然它们的路由前缀不同,但它们的解析路由是匹配的。例如,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:路由约束

<

路径约束/strong>

路由约束允许你限制路由中的参数模板匹配。一般的语法是"{parameter:constraint}"。例如:

[Route("users/{id:int}"]
public User GetUserById(int id) { ... }
[Route("users/{name}"]
public User GetUserByName(string name) { ... }

在这里,第一条路由只会被选中,如果"id"段是URI是一个整数。否则,将选择第二条路线。