📜  aspnet 核心 webapi ActionDescriptor 不包含 GetCustomAttributes (1)

📅  最后修改于: 2023-12-03 14:59:24.716000             🧑  作者: Mango

ASP.NET Core WebAPI ActionDescriptor 不包含 GetCustomAttributes

在 ASP.NET Core WebAPI 中,ActionDescriptor 是一个表示控制器方法的类。它可以用于检查控制器方法特性信息以及其他有用的信息。然而,如果你尝试使用 GetCustomAttributes 方法来检索控制器方法的特性,你会遇到问题:它不被 ActionDescriptor 支持!

何谓 GetCustomAttributes 方法?

GetCustomAttributes 是 .NET 框架中 Type 类的一个成员函数。使用该函数,你可以检索一个 .NET 对象中的特性列表。举例来说,在 ASP.NET WebAPI 中,你可以使用 GetCustomAttributes 函数来检索控制器方法的特性列表。但在 ASP.NET Core WebAPI 中,你会发现 ActionDescriptor 没有实现 GetCustomAttributes 函数。

如何获取控制器方法的特性?

为了获取控制器方法的特性,你可以使用 GetControllerAction方法,该方法将返回控制器方法的 ActionDescriptor。一旦你有了该描述符对象,你将能够检索控制器方法的各种信息,如特性。

以下是一个使用 GetControllerAction 方法检索控制器方法特性的例子:

[HttpGet]
[Route("sample")]
[AllowAnonymous]   
public async Task<IActionResult> GetSample()    
{
    var actionDescriptor = ControllerContext.ActionDescriptor as ControllerActionDescriptor;
    if (actionDescriptor != null)   
    {    
        var allowAnonymous = actionDescriptor.MethodInfo.GetCustomAttributes(inherit: true).Any(a => a.GetType() == typeof(AllowAnonymousAttribute));
        if (allowAnonymous)
        {
            // do something
        }
    }
    // do something
}

在上面的示例中,我们使用 GetControllerAction 方法获得控制器方法的 ActionDescriptor,在这个描述符中检索 MethodInfo 的特性并查看 AllowAnonymousAttribute 是否存在。如果它存在,就执行特定的动作。

总结

虽然 ActionDescriptor 不直接支持 GetCustomAttributes 方法,但你可以使用 GetControllerAction 方法来获取控制器方法的描述符,然后使用 MethodInfo 对象的 GetCustomAttributes 方法来检查其特性信息。这可让你轻松获取控制器方法的关键信息,在开发过程中更加高效。