6

我有一個ASP.NET Web API項目。使用反射,我怎樣才能得到裝飾我的動作方法的Http動詞(下面例子中的[HttpGet])屬性?如何獲取使用反射的動作的http動詞屬性 - ASP.NET Web API

[HttpGet] 
public ActionResult Index(int id) { ... } 

假設我在我的控制器中有上述操作方法。到目前爲止,通過使用反射我已經能夠得到,我有存儲在一個名爲變量Index操作方法的MethodInfo對象methodInfo

我嘗試使用以下命令獲取HTTP動詞,但它沒有工作 - 回報空:

var httpVerb = methodInfo.GetCustomAttributes(typeof (AcceptVerbsAttribute), false).Cast<AcceptVerbsAttribute>().SingleOrDefault(); 

東西,我注意到:

上面我的例子是我工作的一個ASP.NET的Web API項目。

看來,[HttpGet]是System.Web.Http.HttpGetAttribute

但在常規ASP.NET MVC項目的[HttpGet]是System.Web.Mvc.HttpGetAttribute

回答

4
var methodInfo = MethodBase.GetCurrentMethod(); 
var attribute = methodInfo.GetCustomAttributes(typeof(ActionMethodSelectorAttribute), true).Cast<ActionMethodSelectorAttribute>().FirstOrDefault(); 

你是非常接近......

不同的是,所有的「動詞」繼承屬性「ActionMethodSelectorAttribute」我包括'AcceptVerbsAttribute'屬性。

+0

謝謝@Elie,但是,您的解決方案僅適用於ASP.NET MVC應用程序,但不適用於ASP.NET Web API應用程序。在一個WEB API項目中,http動詞--HttpGet與MVC項目中的HttpGet不同。 – cda01

2

我只是需要這個,因爲沒有解決Web API屬性的實際需求的答案,所以我發佈了我的答案。

網絡API屬性如下:

  • System.Web.Http.HttpGetAttribute
  • System.Web.Http.HttpPutAttribute
  • System.Web.Http.HttpPostAttribute
  • 的System.Web .Http.HttpDeleteAttribute

不像它們的Mvc對應物,它們不是繼承自基本屬性類型,而是繼承直接從System.Attribute。因此,您需要分別手動檢查每種特定類型。

我做了一個擴展的MethodInfo類,像這樣一個小的擴展方法:

public static IEnumerable<Attribute> GetWebApiMethodAttributes(this MethodInfo methodInfo) 
    { 
     return methodInfo.GetCustomAttributes().Where(attr => 
      attr.GetType() == typeof(HttpGetAttribute) 
      || attr.GetType() == typeof(HttpPutAttribute) 
      || attr.GetType() == typeof(HttpPostAttribute) 
      || attr.GetType() == typeof(HttpDeleteAttribute) 
      ).AsEnumerable(); 
    } 

一旦你已經得到了通過反射你的控制器的操作方法的MethodInfo對象,調用上面的擴展方法會得到你當前在該方法中的所有操作方法屬性:

var webApiMethodAttributes = methodInfo.GetWebApiMethodAttributes(); 
+0

你有沒有考慮過:'methodInfo.GetCustomAttributes()。where(attr => attr is IActionHttpMethodProvider)' – Trevor

相關問題