2012-11-27 76 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") 
    };