Web API - 支持的动词?

Jim*_*im 2 asp.net-web-api asp.net-web-api-routing

我把共同为本地代码阵营谈话,我试图了解ApiController HTTP动词的细微差别.约ApiController几件事情Beta版,RC最终版本,并建议之间显著改变你如何设置这是相互矛盾的,有时甚至是错误的.

假设我刚刚离开WebApiConfig中的标准路由:

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
Run Code Online (Sandbox Code Playgroud)

(因为你真的可以把东西放在自己的头上,如果你在{}动作添加参数点击这里)

我理解约定如何适用于简单的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)
    {
    }
Run Code Online (Sandbox Code Playgroud)

或者你可以改变这些,只要它们以动词名称开头:

    // GET api/values/5
    public string GetMyStuff(int id)
    {
        return "value";
    }
Run Code Online (Sandbox Code Playgroud)

但是,最初的规范说ApiController支持Get,Put,Post和Delete.然而,我可以添加方法:

    public void HeadOfTheClass()
    {
    }
Run Code Online (Sandbox Code Playgroud)

哪个适用于Head动词,但我无法为隐藏或不存在的动词添加方法:

    public void MKCOL()
    {
    }
    public void Bubba()
    {
    }
Run Code Online (Sandbox Code Playgroud)

Native"Supported"动词的完整列表是什么?

但是,我可以使用AcceptVerb属性添加对这些方法的支持:

    [AcceptVerbs("MKCOL")] 
    public void MKCOL()
    {
    }
    [AcceptVerbs("Bubba")]
    public void Bubba()
    {
    }
Run Code Online (Sandbox Code Playgroud)

这也有效,或者对于任何"已定义"的动词使用Http属性:

    [HttpHead]
    public void HeadOfTheClass()
    {
    }

   [HttpGet]
    public void Bubba()
    {
    }
Run Code Online (Sandbox Code Playgroud)

哪个是正确的还是首选的?(也有像[GET]和[POST]这样的属性,这些是否被弃用?)

[HttpBindNever]和[NonAction]是否相同?

Sco*_*ttS 7

我喜欢开源.:)

来自ReflectedHttpActionDescriptor:

private static readonly HttpMethod[] _supportedHttpMethodsByConvention = 
    { 
        HttpMethod.Get, 
        HttpMethod.Post, 
        HttpMethod.Put, 
        HttpMethod.Delete, 
        HttpMethod.Head, 
        HttpMethod.Options, 
        new HttpMethod("PATCH") 
    };
Run Code Online (Sandbox Code Playgroud)