具有不同参数名称Web Api的单个路径上的多个GET动词

时间:2013-10-10 12:56:38

标签: asp.net-web-api attributerouting

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

我需要关注

/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."
}

1 个答案:

答案 0 :(得分:1)

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

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

您可以尝试以下操作:

  1. 使用ActionName为上述两种方法设置相同的操作名称 属性。

  2. 如果1.没有意义,你可能会有不同的路线模板。