【问题标题】:Is RoutePrefix attribute substring sensitive?RoutePrefix 属性子字符串是否敏感?
【发布时间】:2016-10-31 16:53:36
【问题描述】:

我创建了三个带有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 匹配的控制器类型。这个可以 如果多个控制器上的属性路由与请求的匹配,则会发生 网址。该请求找到了以下匹配的控制器类型: ...例外。

RoutePrefix 属性子字符串是否敏感?

【问题讨论】:

  • 为什么多次使用同一个控制器名称?
  • @CodeNotFound 对不起,我在这里犯了三个控制器错误。
  • 你必须小心路由和参数。例如,如果您的路由api/foo/users 需要一个字符串作为参数,那么api/foo/usersapi/foo/users/moviesapi/foo/users/books 都将是对api/foo/users/parameter 的有效调用,并且web api 将不知道他将发送到哪个路由您的要求
  • 可以为每个控制器添加动作吗?我认为 ControllerOne 中的某些操作与其他控制器中的某些操作相匹配。
  • ControllerOne 中的动作匹配“电影”路由。

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


【解决方案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} 将有助于解决您的问题!但在创建路线时要小心! ;)

【讨论】:

    【解决方案2】:

    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方法会干扰RoutePrefixControllerThree

    【讨论】:

    • 您可以限制参数的类型,我会写一个答案来说明这一点! ;)
    猜你喜欢
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 2013-10-31
    • 2010-12-26
    相关资源
    最近更新 更多