1.在controller中添加AllowAnonymous(Microsoft.AspNetCore.Authorization.AllowAnonymousAttribute),在自定义过滤器中判断是否有此特性,发现实际关联的是AllowAnonymousFilter(Microsoft.AspNetCore.Mvc.Authorization.AllowAnonymousFilter)
2.过滤器通过Attribute,与5大类过滤器接口(IAuthorizationFilter、IResourceFilter、IActionFilter、IExceptionFilter、IResultFilter)定义的过滤器内部定义变量(值类型或者引用类型),二次访问的时候内次都是默认值,但是通过ActionFilterAttribute相关的抽象类定义的过滤器则发现他们类似是单例模式
求解
问题是啥?有什么疑惑?
1.为什么我使用的头标签明明是Microsoft.AspNetCore.Authorization.AllowAnonymousAttribute类型的,在过滤器中调试发现,变成了Microsoft.AspNetCore.Mvc.Authorization.AllowAnonymousFilter
2创建全局过滤器的时候如果是继承Attribute和5大过滤器接口的过滤器,内部有私有变量的时候每个请求都是默认初始化,比如说都是null,但是如果使用ActionFilterAttribute类似的相关抽象接口创建的过滤器在内部定义私有变量的时候,第二次请求这些私有变量默认是第一次请求的设置值
@bird man: 能贴图出来看看吗?
@Jonny-Xhl:
@bird man: 意思是在这能够获取到AllowAnoymousFilter?
OnAuthorization 方法里面的那个 is AllowAnonymous 这个类型不是你自己写的么?指定下命名空间 Microsoft.AspNetCore.Authorization.AllowAnonymousAttribute
调试发现,变成了Microsoft.AspNetCore.Mvc.Authorization.AllowAnonymousFilter,不是声明的Microsoft.AspNetCore.Authorization.AllowAnonymousAttribute
@bird man: 对呀,两个特性名称一样,但是命名空间不一样。在 .NET Framework, mvc 和 web api 就有两个
@the boy、图样图森破: 麻烦看清楚问题,问题说的是,声明使用的是A,但是过滤器中调试发现变成了B,其他的并没有出现变化
@bird man: 你在 controller 上使用的是 AllowAnonymousAttribute,但是你在 “过滤器中调试”中是获取的AllowAnonymousFilter,你的意思是 AllowAnonymousAttribute 变成了AllowAnonymousFilter?
干了多年开发越来越觉得,异常处理和定位的能力反映出开发者硬核能力。对每一次线bug排查的复盘和总结,能让你功力倍增。
在日常开发中,除了考虑代码的严谨性,还要重视日子的记录。
通过使用ASP.NET Core
中的筛选器,可在请求处理管道中的特定阶段之前或之后运行代码。
内置过滤器处理任务,例如:
可以创建自定义过滤器,用于处理横切关注点。 横切关注点的示例包括错误处理、缓存、配置、授权和日志记录。 过滤器可以避免复制代码。 例如,错误处理异常过滤器可以合并错误处理。
过滤器在 ASP.NET Core
操作调用管道(有时称过滤器管道)内运行。 过滤器管道在 ASP.NET Core 选择了要执行的操作之后运行。
熟悉.NET MVC
框架的同学应该知道,MVC也提供了5大过滤器供我们用来处理请求前后需要执行的代码。分别是授权过滤器(AuthenticationFilter),资源过滤器(resource-filters),操作过滤器(ActionFilter),异常过滤器(ExceptionFilter),结果过滤器(ResultFilter)。
每种过滤选器类型都过滤器管道中的不同阶段执行:
授权过滤器最先运行,用于确定是否已针对请求为用户授权。 如果请求未获授权,授权过滤器可以让管道短路。
资源过滤器:
操作过滤器:
异常过滤器在向响应正文写入任何内容之前,对未经处理的异常应用全局策略。
结果过滤器在执行操作结果之前和之后立即运行代码。 仅当操作方法成功执行时,它们才会运行。 对于必须围绕视图或格式化程序的执行的逻辑,它们很有用。
下图展示过滤器类型在筛选器管道中的交互方式。
在.net core 中,一般是在StartUp.cs的ConfigureServices方法中注册
// 将异常过滤器注入到容器中
services.AddScoped<GlobalExceptionFilter>();
更多查看 .NET Core过滤器(Filter)