0

如何使用单个路由根据参数名称调用不同的不同动作。

我需要关注

/api/v1/user
GET
key=dfddg&secret=fafassaf&query=select id from user where user like '%ggg%'

/api/v1/user
GET
key=dfddg&secret=fafassaf&ids=fadfdafdsf,faffasfasfsf,asfasfasfasfas,asfasfasfasf

我写了以下代码

[RoutePrefix("api/v1/user")]
public class UserController : ApiController
{
    [GET("")]
    public String GetAllUsers(String key, String secret, String query)
    {
        return "GetAllUsers";
    }

    [GET("")]
    public String GetLookupUserIds(String key, String secret, String ids)
    {
        return "GetLookupUserIds";
    }

但第一种情况工作正常,但第二种情况抛出异常

{
    "Message": "No HTTP resource was found that matches the request URI 'http://localhost:14823/api/v1/user?key=rhdgsdgdsr&secret=fhdgdgdfhdfh&ids=fdfdf,dfadfff'.",
    "MessageDetail": "No action was found on the controller 'User' that matches the request."
}
4

1 回答 1

1

我认为这里的问题是请求api/v1/user与路由表中的第一条路由匹配。(注意:路由匹配首先发生在不考虑查询参数的情况下,然后发生动作匹配)现在,路由中的第一条路由表可以是反射顺序,基于哪个属性路由正在向它添加操作。(您可以检查路由表GlobalConfiguration.Configuration.Routes条目的外观)。

属性路由通过为action变量分配动作名称的值来添加路由。Web API 的动作选择具有逻辑,如果它看到action分配了变量,它将尝试在具有相同名称的动作列表中寻找最佳匹配动作(像你这样的动作重载场景)。

您可以尝试以下方法:

  1. 通过使用属性,上述两种方法具有相同的操作名称。ActionName

  2. 如果 1. 没有意义,您可能有不同的路由模板来执行操作。

于 2013-10-10T13:19:02.947 回答