我创建了三个用RoutePrefix
属性修饰的WebAPI控制器。路线的共享部分如下所示:
[RoutePrefix("api/foo/users")
public class ControllerOne : ApiController
{
...
}
[RoutePrefix("api/foo/users/books")
public class ControllerTwo : ApiController
{
...
}
[RoutePrefix("api/foo/users/movies")
public class ControllerThree : ApiController
{
[HttpGet]
[Route("")]
public void Foo(){}
}
当我调用Foo方法(使用地址.../api/foo/users/movies/
)时,我得到以下异常:
找到了与URL匹配的多种控制器类型。这个可以 如果多个控制器上的属性路由匹配请求,则会发生 URL。该请求已找到以下匹配的控制器类型: ...异常。
RoutePrefix
属性子字符串是否敏感?
答案 0 :(得分:1)
您可以告诉web api
您的参数类型是什么。例如:
[RoutePrefix("api/foo/users")]
public class FirstControllerController : ApiController
{
[Route("{id:int}")]
public string Get(int id)
{
return "users ;)";
}
}
[RoutePrefix("api/foo/users/movies")]
public class SecondControllerController : ApiController
{
[Route("")]
// GET api/values/5
public string Get()
{
return "movies ;)";
}
}
使用[Route("{id:int}")]
,只有在发送整数时该路由才有效。如果不是,它将作为“免费路线”提供。这样,如果你这样做:
GET /api/foo/users/10
您将收到回复"users ;)"
如果你这样做:
GET /api/foo/users/movies
您将收到回复"movies ;)"
我认为使用{id:int}
将有助于解决您的问题!但是在创建路线时要小心! ;)
答案 1 :(得分:0)
RoutePrefix
不是子字符串敏感的 - 但地址中的任何修复后变量 - 即使它是整数 - 都会导致提到异常。
[RoutePrefix("api/foo/users")
public class ControllerOne : ApiController
{
[HttpGet]
[Route("{someVariable}")]
public string Bar(int someVariable){return "FooBar";}
}
[RoutePrefix("api/foo/users/movies")
public class ControllerThree : ApiController
{
[HttpGet]
[Route("")]
public void Foo(){}
}
在上面的代码中,Bar
方法会干扰RoutePrefix
的{{1}}。