Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET WebAPI中的异常[RoutePrefix]行为_C#_Asp.net_Asp.net Web Api_Asp.net Web Api Routing - Fatal编程技术网

C# ASP.NET WebAPI中的异常[RoutePrefix]行为

C# ASP.NET WebAPI中的异常[RoutePrefix]行为,c#,asp.net,asp.net-web-api,asp.net-web-api-routing,C#,Asp.net,Asp.net Web Api,Asp.net Web Api Routing,我有两个控制器,如下所示: [RoutePrefix("v1/user/something")] public class SomethingsController : ApiController { [Route("{id}")] [HttpGet] [ResponseType(typeof(SomethingsViewModel))] public async Task<IHttpActionResult> GetAsync([FromUri]in

我有两个控制器,如下所示:

[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)
    {
    }
}
[RoutePrefix(“v1/user/something”)]
公共类something控制器:ApiController
{
[路由(“{id}”)]
[HttpGet]
[响应类型(类型(SomethingsViewModel))]
公共异步任务GetAsync([FromUri]int-id)
{
}
}
[RoutePrefix(“v1/用户”)]
公共类用户控制器:ApiController
{
[路由(“{id}”)]
[HttpGet]
[授权(角色=“超级管理员”)]
公共异步任务GetByIdAsync([FromUri]int-id)
{
}
}
现在通过查看上面的代码,我认为创建了以下两条路线:

  • v1/user/something/{id}
  • v1/user/{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) { ... }
}
此处,仅当路线的“id”段 URI是一个整数。否则,将选择第二条路线


在属性路由的情况下,Web API尝试查找与请求匹配的所有控制器。如果它看到多个控制器能够处理此问题,则抛出exception@Div我知道这一点,但问题是,如果你看上面的代码,多个控制器应该无法处理它,因为它们的RoutePrefix不同。@haseebahmed7尽管它们的路由前缀不同,但它们的解析路由匹配。例如,
v1/user/{id}
与match
v1/user/something/{id}
匹配,其中第一个路由中的id参数arg将采用
something/{id}
。路由前缀和路由属性组合在一起可创建添加到路由表中的完整路由。可能重复:
[Route("users/{id:int}"]
public User GetUserById(int id) { ... }

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