RoutePrefix属性是否对子串敏感?

时间:2016-10-31 16:53:36

标签: c# rest asp.net-web-api

我创建了三个用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属性子字符串是否敏感?

2 个答案:

答案 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}}。