Web API - 每个HTTP动词/参数组合只有1个动作?

时间:2014-01-01 13:40:36

标签: asp.net-mvc asp.net-web-api asp.net-mvc-routing

我对MVC很熟悉,但对WebAPI来说还是比较新的,我遇到了一个令人困惑的问题。

我有一个名为“DummyController”的控制器(继承自ApiController),它有5个默认的搭建方法,包括get,post,put和delete(2 for get),我在底部添加了自己的方法名为“FindDummyObjects()”,我用[HttpGet]属性修饰。

当我导航到“api / dummy”或“api / dummy / get”时,我得到2个字符串对象(“value1”和“value2”)的默认结果。 但是,当我导航到“api / dummy / FindDummyObjects”时,它会抱怨“参数字典包含参数'id'的空条目”。

这意味着它根本没有指向我的Action(因为它是无参数的),所以它可能指向默认的“Get(int id)”动作。

当我评论除了我自己以外的所有动作时,我得到了我期望的结果。

所以我的问题是,使用WebAPI,每个http动词只能有一个动作和一组参数,无论动作名称是否不同?

例如,似乎我不可能在单个控制器中执行10个不同的http GET操作,除非它们都有不同的参数并使用操作名称“Get”(除非我做一些自定义路由我假设)。

这是对的吗?

代码:             // GET api / dummy         public IEnumerable Get()         {             return new string [] {“value1”,“value2”};         }

    // GET api/dummy/5
    public string Get(int id)
    {
        return "value";
    }

    // POST api/dummy
    public void Post([FromBody]string value)
    {
    }

    // PUT api/dummy/5
    public void Put(int id, [FromBody]string value)
    {
    }

    // DELETE api/dummy/5
    public void Delete(int id)
    {
    }

    [HttpGet]
    public IEnumerable<Models.DummyObject> FindDummyObjects()
    {
        IList<Models.DummyObject> myDummyList = new List<Models.DummyObject>();

        for (int i = 0; i < 10; i++)
        {
            Models.DummyObject dumObj = new Models.DummyObject();
            dumObj.ObjectId = i;
            dumObj.ObjectName = string.Empty;

            myDummyList.Add(dumObj);
        }

        return myDummyList;
    }

1 个答案:

答案 0 :(得分:1)

Web API路由有很多漏洞(我很有礼貌),你碰巧遇到了一个漏洞。这是他们在Web API2中引入属性路由的原因之一。你可能想尝试一下,因为它更灵活一点。