首页 新闻 会员 周边

.netcore 过滤器问题

0
[待解决问题]

1.在controller中添加AllowAnonymous(Microsoft.AspNetCore.Authorization.AllowAnonymousAttribute),在自定义过滤器中判断是否有此特性,发现实际关联的是AllowAnonymousFilter(Microsoft.AspNetCore.Mvc.Authorization.AllowAnonymousFilter)
2.过滤器通过Attribute,与5大类过滤器接口(IAuthorizationFilter、IResourceFilter、IActionFilter、IExceptionFilter、IResultFilter)定义的过滤器内部定义变量(值类型或者引用类型),二次访问的时候内次都是默认值,但是通过ActionFilterAttribute相关的抽象类定义的过滤器则发现他们类似是单例模式

求解

bird man的主页 bird man | 初学一级 | 园豆:4
提问于:2020-07-01 11:58
< >
分享
所有回答(3)
0

问题是啥?有什么疑惑?

Jonny-Xhl | 园豆:691 (小虾三级) | 2020-07-01 14:40

1.为什么我使用的头标签明明是Microsoft.AspNetCore.Authorization.AllowAnonymousAttribute类型的,在过滤器中调试发现,变成了Microsoft.AspNetCore.Mvc.Authorization.AllowAnonymousFilter

支持(0) 反对(0) bird man | 园豆:4 (初学一级) | 2020-07-01 14:42

2创建全局过滤器的时候如果是继承Attribute和5大过滤器接口的过滤器,内部有私有变量的时候每个请求都是默认初始化,比如说都是null,但是如果使用ActionFilterAttribute类似的相关抽象接口创建的过滤器在内部定义私有变量的时候,第二次请求这些私有变量默认是第一次请求的设置值

支持(0) 反对(0) bird man | 园豆:4 (初学一级) | 2020-07-01 14:44

@bird man: 能贴图出来看看吗?

支持(0) 反对(0) Jonny-Xhl | 园豆:691 (小虾三级) | 2020-07-01 14:44

@Jonny-Xhl:

支持(0) 反对(0) bird man | 园豆:4 (初学一级) | 2020-07-01 14:47

@bird man: 意思是在这能够获取到AllowAnoymousFilter?

支持(0) 反对(0) Jonny-Xhl | 园豆:691 (小虾三级) | 2020-07-01 14:56
0

OnAuthorization 方法里面的那个 is AllowAnonymous 这个类型不是你自己写的么?指定下命名空间 Microsoft.AspNetCore.Authorization.AllowAnonymousAttribute

the boy、图样图森破 | 园豆:112 (初学一级) | 2020-07-02 15:18

调试发现,变成了Microsoft.AspNetCore.Mvc.Authorization.AllowAnonymousFilter,不是声明的Microsoft.AspNetCore.Authorization.AllowAnonymousAttribute

支持(0) 反对(0) bird man | 园豆:4 (初学一级) | 2020-07-02 15:28

@bird man: 对呀,两个特性名称一样,但是命名空间不一样。在 .NET Framework, mvc 和 web api 就有两个

支持(0) 反对(0) the boy、图样图森破 | 园豆:112 (初学一级) | 2020-07-02 15:30

@the boy、图样图森破: 麻烦看清楚问题,问题说的是,声明使用的是A,但是过滤器中调试发现变成了B,其他的并没有出现变化

支持(0) 反对(0) bird man | 园豆:4 (初学一级) | 2020-07-02 15:32

@bird man: 你在 controller 上使用的是 AllowAnonymousAttribute,但是你在 “过滤器中调试”中是获取的AllowAnonymousFilter,你的意思是 AllowAnonymousAttribute 变成了AllowAnonymousFilter?

支持(0) 反对(0) the boy、图样图森破 | 园豆:112 (初学一级) | 2020-07-02 15:41
0

.NET Core过滤器(Filter)

  干了多年开发越来越觉得,异常处理和定位的能力反映出开发者硬核能力。对每一次线bug排查的复盘和总结,能让你功力倍增。
在日常开发中,除了考虑代码的严谨性,还要重视日子的记录。

过滤器

  通过使用ASP.NET Core 中的筛选器,可在请求处理管道中的特定阶段之前或之后运行代码。

  内置过滤器处理任务,例如:

  • 授权(防止用户访问未获授权的资源)。
  • 响应缓存(对请求管道进行短路出路,以便返回缓存的响应)。

  可以创建自定义过滤器,用于处理横切关注点。 横切关注点的示例包括错误处理、缓存、配置、授权和日志记录。 过滤器可以避免复制代码。 例如,错误处理异常过滤器可以合并错误处理。

过滤器的工作原理

  过滤器在 ASP.NET Core 操作调用管道(有时称过滤器管道)内运行。 过滤器管道在 ASP.NET Core 选择了要执行的操作之后运行。

使用场景

过滤器类型

  熟悉.NET MVC框架的同学应该知道,MVC也提供了5大过滤器供我们用来处理请求前后需要执行的代码。分别是授权过滤器(AuthenticationFilter),资源过滤器(resource-filters),操作过滤器(ActionFilter),异常过滤器(ExceptionFilter),结果过滤器(ResultFilter)。

  每种过滤选器类型都过滤器管道中的不同阶段执行:

  • 授权过滤器最先运行,用于确定是否已针对请求为用户授权。 如果请求未获授权,授权过滤器可以让管道短路。

  • 资源过滤器

    • 授权后运行。
    • OnResourceExecuting 在过滤器管道的其余阶段之前运行代码。 例如,OnResourceExecuting 在模型绑定之前运行代码。
    • OnResourceExecuted 在管道的其余阶段完成之后运行代码。
  • 操作过滤器

    • 在调用操作方法之前和之后立即运行代码。
    • 可以更改传递到操作中的参数。
    • 可以更改从操作返回的结果。
    • 不可在 Razor Pages 中使用。
  • 异常过滤器在向响应正文写入任何内容之前,对未经处理的异常应用全局策略。
    结果过滤器在执行操作结果之前和之后立即运行代码。 仅当操作方法成功执行时,它们才会运行。 对于必须围绕视图或格式化程序的执行的逻辑,它们很有用。

  下图展示过滤器类型在筛选器管道中的交互方式。
使用场景

过滤器使用

  在.net core 中,一般是在StartUp.cs的ConfigureServices方法中注册

// 将异常过滤器注入到容器中
services.AddScoped<GlobalExceptionFilter>();

更多查看 .NET Core过滤器(Filter)

智客工坊 | 园豆:1855 (小虾三级) | 2020-08-07 22:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册