我正在为本地Code Camp组织一次演讲,并试图了解ApiController中HTTP动词的细微差别。关于ApiController的一些事情在Beta,RC和最终版本之间发生了显着变化,关于如何设置它的建议是冲突的,有时是错误的。
假设我刚刚离开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()
{
}
哪个适用于Head动词,但我无法为隐藏或不存在的动词添加方法:
public void MKCOL()
{
}
public void Bubba()
{
}
Native“Supported”动词的完整列表是什么?
但是,我可以使用AcceptVerb属性添加对这些方法的支持:
[AcceptVerbs("MKCOL")]
public void MKCOL()
{
}
[AcceptVerbs("Bubba")]
public void Bubba()
{
}
这也有效,或者对于任何“已定义”的动词都使用Http属性:
[HttpHead]
public void HeadOfTheClass()
{
}
[HttpGet]
public void Bubba()
{
}
哪个是正确的还是首选的? (还有像[GET]和[POST]这样的属性,这些是否已被弃用?)
[HttpBindNever]和[NonAction]是否等效?
答案 0 :(得分:7)
我喜欢开源。 :)
来自ReflectedHttpActionDescriptor:
private static readonly HttpMethod[] _supportedHttpMethodsByConvention =
{
HttpMethod.Get,
HttpMethod.Post,
HttpMethod.Put,
HttpMethod.Delete,
HttpMethod.Head,
HttpMethod.Options,
new HttpMethod("PATCH")
};