6

Tengo un proyecto de API web de ASP.NET. Usando la reflexión, ¿cómo puedo obtener el atributo del verbo Http ([HttpGet] en el ejemplo a continuación) que decora mis métodos de acción?¿Cómo obtengo el atributo de verbo http de una acción usando refection? ASP.NET Web API

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

Supongamos que tengo el método de acción anterior en mi controlador. Hasta ahora, al usar la reflexión he podido obtener un objeto MethodInfo del método de acción Index que he almacenado en una variable llamada methodInfo

Intenté obtener el verbo http utilizando lo siguiente pero no funcionó - devoluciones null:

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

Algo me di cuenta:

Mi ejemplo anterior es un proyecto de API web ASP.NET que estoy trabajando.

Parece que el [HttpGet] es una System.Web.Http.HttpGetAttribute

pero en regular de ASP.NET MVC proyecta la [HttpGet] es un System.Web.Mvc.HttpGetAttribute

Respuesta

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

Eras muy cerca ...

La diferencia es que todo 'verbo' atributos heredar del 'ActionMethodSelectorAttribute' i incluyendo el atributo 'AcceptVerbsAttribute'.

+0

Gracias @Elie, sin embargo, su solución solo funciona para una aplicación ASP.NET MVC pero no para una aplicación ASP.NET Web API.En un proyecto de API WEB, el verbo http - HttpGet, es diferente del HttpGet en un proyecto MVC. – cda01

2

Lo necesitaba y como no se ha respondido al requisito real de los atributos de la API web, publiqué mi respuesta.

atributos Web API son los siguientes:

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

A diferencia de sus contrapartes de Mvc, no heredan de un tipo de atributo base, sino que heredan directamente desde System.Attribute. Por lo tanto, debe verificar manualmente cada tipo específico de forma individual.

que he hecho un pequeño método de extensión que se extiende la clase MethodInfo así:

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(); 
    } 

Una vez que tenga el objeto MethodInfo para su método de acción del controlador por la reflexión, llamando al método de extensión por encima de lo llevará todos los atributos del método de acción actualmente en ese método:

var webApiMethodAttributes = methodInfo.GetWebApiMethodAttributes(); 
+0

¿Ha considerado: 'methodInfo.GetCustomAttributes(). Where (attr => attr es IActionHttpMethodProvider)' – Trevor

Cuestiones relacionadas