2016-03-10 55 views
7

看起來,ASP.NET隱式地將名爲GetXPostX的方法分別解釋爲GET和POST方法,因爲它們的名稱前綴爲HTTP方法名稱。 PUT和DELETE也是這種情況。如何停止ASP.NET Web API隱式解釋HTTP方法?

我有一個不幸名爲Delete的方法,但我希望它被解釋爲POST,所以我明確指定它是使用[HttpPost]屬性的POST。這工作,只要它不是一個接口中聲明...

public interface IFooBarController 
{ 
    [HttpPost] 
    void DoSomething(); 

    [HttpPost] 
    void Delete(int id); 
} 

public class FooBarController : IFooBarController 
{ 
    public void DoSomething() 
    { 
     // This API method can only be called using POST, 
     // as you would expect from the interface. 
    } 

    public void Delete(int id) 
    { 
     // This API method can only be called using DELETE, 
     // even though the interface specifies [HttpPost]. 
    } 
} 

我怎樣才能解決這個問題,而無需指定HttpPostAttribute每個實現的?

+0

你會在這個web api上使用Attribute routing嗎? – Nkosi

+1

在我看來,http動詞是實現細節,不屬於一個接口。 –

+0

@BigDaddy,我會說他們是API方法簽名的一部分。 –

回答

2

像其他人所說的,屬性是不能繼承的。由於界面中的屬性,DoSomething不會使用POST進行調用,而是因爲它是默認值。在你的界面中將它改爲GET,你仍然會注意到POST調用它。

您可以在「動作選擇」部分閱讀更多關於如何執行動作選擇here的信息。 (第3項回答你關於爲什麼使用POST調用DoSomething的問題)

1

屬性不是從已實現的接口繼承的,您必須在具體實現(FooBarController)上聲明該屬性。這會覆蓋基於約定的綁定。

+1

如果這是真的,即使所述接口的實現不重複HttpPostAttribute,只能使用POST調用接口方法'[HttpPost] DoSomething()'怎麼樣? –

-2

使用[ActionName] attribue並將它命名爲您希望在接口屬性

4

屬性不會被繼承的類,你可以讓你的界面的抽象類。

找到答案從Microsoft

產品團隊不希望實現此功能,主要有兩個原因 :

  • 一致性與DataAnnotations.Validator
  • 一致性與驗證行爲在ASP.Net MVC
  • 棘手的情況:一個類實現兩個 接口它們具有相同的屬性,但在其上具有衝突的 屬性。哪個屬性優先?

來源:Attribute on Interface members does not work

+0

我對此提出了另一個問題,但我會在此重複。如果屬性不被繼承,那麼即使所述接口的實現不重複HttpPostAttribute,只能使用POST調用接口方法'[HttpPost] DoSomething()'怎麼樣? –

+0

你必須繞過抽象類。 – raoon

+0

等待我現在不能驗證;)當我回到家時我會做:p – raoon

相關問題