我正在为本地代码营组织一次演讲,并试图了解 ApiController 中 HTTP 动词的细微差别。在 Beta、RC 和最终版本之间,关于 ApiController 的一些事情发生了显着变化,关于如何设置它的建议是相互矛盾的,有时甚至是错误的。
假设我只是将标准路由留在 WebApiConfig 中:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
(因为如果你在这里添加一个 {action} 参数,你真的可以把事情放在他们的头上)
我了解该约定如何适用于简单的 Crud 调用,例如:
// GET api/values
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET api/values/5
public string Get(int id)
{
return "value";
}
// POST api/values
public void Post([FromBody]string value)
{
}
或者,只要它们以动词名称开头,您就可以更改它们:
// GET api/values/5
public string GetMyStuff(int id)
{
return "value";
}
但是,最初的规范说 ApiController 支持 Get、Put、Post 和 Delete。然而,我可以添加以下方法:
public void HeadOfTheClass()
{
}
这适用于头部动词,但我不能为晦涩或不存在的动词添加方法:
public void MKCOL()
{
}
public void Bubba()
{
}
原生“支持”动词的完整列表是什么?
但是,我可以使用 AcceptVerb 属性添加对这些方法的支持:
[AcceptVerbs("MKCOL")]
public void MKCOL()
{
}
[AcceptVerbs("Bubba")]
public void Bubba()
{
}
这也有效,或者对于任何“定义的”动词使用 Http 属性:
[HttpHead]
public void HeadOfTheClass()
{
}
[HttpGet]
public void Bubba()
{
}
哪个是正确的或首选的?(还有像 [GET] 和 [POST] 这样的属性,这些是否已弃用?)
[HttpBindNever] 和 [NonAction] 是否等效?