前言

Attribute 在 C# 中是一个非常强大的特性,它能够给你的程序集添加元数据信息。

Attribute 实际上是一个对象,它可以与以下元素中的任何一个相关联: 程序集、类、方法、委托、枚举、事件、字段、接口、属性和结构,它会在这些对象上做信息声明,当程序运行之后,你可以通过反射来获取关联到这些对象上的 Attribute 信息,换句话说:你可以通过 Atrribute 向程序集注入一些额外信息,然后在运行时通过反射来获取,attribute 一般由 名字 + 一些可选参数 构成, attribute 名字对应着 atrribute 类。

Filter 的多种注册

  1. 在 Action 方法上加特性,只对当前 Action 生效
  2. 在 Controller 控制器上加特性,当前控制器下所有 Action 都生效
  3. 在程序中全局注册,整个项目都生效
    1
    2
    3
    builder.Services.AddControllersWithViews(mvcOptions => {
    mvcOptions.Filters.Add(AsyncMyLogActionFilterAttribute);
    });

匿名支持

单个 Action 注册是对某一个 Action 生效

但是控制器、全局注册都是批量注册,存在“误伤”

系统提供 AllowAnonymousAttribute,有部分可以使用,有部分不能直接使用

  • 扩展 IResourceFilter 不能直接使用,需要扩展支持
  • 扩展 IActionFilter 不能直接使用,需要扩展支持
  • 扩展 IResultFilter 不能直接使用,需要扩展支持

创建 MyAllowAnonymousAttribute 方法,继承 Attribute

扩展方法中加入如下代码即可

1
2
3
4
5
//context.ActionDescriptor.EndpointMetadata中包含当前访问的Action上或Actuion所在控制器上所有的特性
if (context.ActionDescriptor.EndpointMetadata.Any(x=>x.GetType().Equals(typeo(MyAllowAnonymousAttribute))))
{
return;
}

.Net Core 6 框架中支持的特性

Post not found: DotNetCore/03.对于AOP多种支持