Web API - 每个 HTTP 动词/参数组合只有 1 个操作?
Posted
技术标签:
【中文标题】Web API - 每个 HTTP 动词/参数组合只有 1 个操作?【英文标题】:Web API - Only 1 Action Per HTTP Verb/Parameter Combination? 【发布时间】:2014-01-19 02:08:53 【问题描述】:我对 MVC 非常熟悉,但对 WebAPI 还是很陌生,我遇到了一个令人困惑的问题。
我有一个名为“DummyController”的控制器(继承自 ApiController),它有 5 个默认的 get、post、put 和 delete 脚手架方法(2 个用于 get),我在底部添加了我自己的方法名为“FindDummyObjects()”,我用 [HttpGet] 属性进行了修饰。
当我导航到“api/dummy”或“api/dummy/get”时,我会得到 2 个字符串对象(“value1”和“value2”)的默认结果。 但是,当我导航到“api/dummy/FindDummyObjects”时,它会抱怨“参数字典包含参数 'id' 的空条目”。
这意味着它根本没有指向我的动作(因为它是无参数的),所以它可能指向默认的“Get(int id)”动作。
当我注释掉除我自己之外的所有操作时,我会得到我期望的结果。
所以我的问题是,对于 WebAPI,每个带有特定参数集的 http 动词是否只能有 1 个动作,而不管动作的名称是否不同?
例如,我似乎不可能在单个控制器中执行 10 个不同的 http GET 操作,除非它们都有不同的参数并使用操作名称“Get”(除非我做了一些自定义路由,否则我假设)。
对吗?
代码: // 获取 api/dummy 公共 IEnumerable Get() 返回新字符串[] "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;
【问题讨论】:
这听起来不像是正确的行为。如果动作的名称不同,那么它们是完全不同的路线,框架应该很容易确定哪个是哪个。你能展示实际的代码而不是仅仅描述它吗? 刚刚按要求添加了代码 为什么有FindDummyObjects
方法?您似乎不尊重 RESTful 约定。您需要的是DummiesController
上的IEnumerable<Models.DummyObject> Get()
方法。当您进行 RESTful 路由时,始终考虑资源。
@Darin Dimitrov 我现在只是在试验。我知道这就是我可以让它工作的方式,但我更感兴趣的是为什么我描述的实现不起作用工作。
它不起作用,因为开箱即用的 ASP.NET Web API 依赖于标准 RESTful 路由。它预计如果某些开发人员选择了这个框架,他可能希望使用 REST 作为约定。如果他想违反这些约定,那么他将需要采取艰难的方式并修改他的路由等......或者可能只是使用一些 RPC 框架,例如 WCF,其中没有资源并且 HTTP 动词不占主导地位。
【参考方案1】:
Web API 路由有很多漏洞(我很客气),你碰巧碰到了一个。这也是他们在 Web API2 中引入属性路由的原因之一。您可能想尝试一下,因为它更加灵活。
【讨论】:
以上是关于Web API - 每个 HTTP 动词/参数组合只有 1 个操作?的主要内容,如果未能解决你的问题,请参考以下文章