为什么不捕获 [HttpGet] 和 [HttpPost] 属性

本文关键字:HttpPost 属性 HttpGet 为什么不 | 更新日期: 2023-09-27 17:58:07

>我有一段代码,比如

foreach(var controller in controllers)
{
   // ... 
   var actions = controller.GetMethods()
                           .Where(method => method.ReturnType == typeof(IHttpActionResult));
   foreach(var action in actions)
   {
      // ... 
      var httpMethodAttribute = action.GetCustomAttributes(typeof(System.Web.Mvc.ActionMethodSelectorAttribute), true).FirstOrDefault() as System.Web.Mvc.ActionMethodSelectorAttribute;
      // ... 
   }
}

但出于某种原因,即使我可以确认action有一个is System.Web.Mvc.ActionMethodSelectorAttributeCustomAttributehttpMethodAttribute也总是null.知道我做错了什么吗?

为什么不捕获 [HttpGet] 和 [HttpPost] 属性

GetCustomAttributes(..., true)仅获取您指定的确切类型的属性,搜索要调用GetCustomAttributes的成员的继承层次结构。 它不会获取从您要搜索的属性类型继承的属性。

要获得HttpGetAttribute,您需要致电GetCustomAttributes(typeof(HttpGetAttribute), true)HttpPostAttribute也是如此.

例如,如果您有一个操作方法Foo重写来自父控制器的方法,并且父控制器的Foo具有属性,则第二个参数将告知GetCustomAttributes是否返回父控制器自定义属性。

晚了一年,但如果你想得到HttpMethodAttribute:

var httpMethodAttr = (HttpMethodAttribute)action.GetCustomAttributes()
                        .SingleOrDefault(a => typeof(HttpMethodAttribute).IsAssignableFrom(a.GetType());

或者如果类型是你所追求的

var httpMethodType = (from a in action.GetCustomAttributes()
                      let t = a.GetType()
                      where typeof(HttpMethodAttribute).IsAssignableFrom(t)
                      select t).SingleOrDefault();
if (httpMethodType = null || httpMethodType == typeof(HttpGetAttribute))