2012-11-27 77 views
2

我正在为本地代码夏令营进行讨论,并试图了解ApiController中HTTP动词的细微差别。关于ApiController的几件事情在Beta,RC和最终版本之间发生了很大的变化,关于如何设置它的建议是冲突的,有时是错误的。Web API - 支持的动词?

假设我只是留在WebApiConfig标准路由:

 config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 

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

我了解该公约是工作简单的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() 
    { 
    } 

什么是完整的列表本机“支持”动词?

[AcceptVerbs("MKCOL")] 
    public void MKCOL() 
    { 
    } 
    [AcceptVerbs("Bubba")] 
    public void Bubba() 
    { 
    } 

这也适用,或任何“定义”动词使用http属性:

[HttpHead] 
    public void HeadOfTheClass() 
    { 
    } 

    [HttpGet] 
    public void Bubba() 
    { 
    } 

这是

我可以然而通过使用AcceptVerb属性添加这些方法支持正确或优先? (还有[GET]和[POST]等属性,这些是否被弃用?)

[HttpBindNever]和[NonAction]是否等效?

+0

在所以最好是在一个时间要求只有一个问题。我回答了什么似乎是主要问题。如果您编辑此问题并从中创建2个或3个单独的问题,这可能是最好的。 – ScottS

回答

6

我喜欢开源。 :)

从ReflectedHttpActionDescriptor:

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