首页 > 编程语言 >ASP.NET Core Filter

ASP.NET Core Filter

时间:2023-11-02 14:12:45浏览次数:43  
标签:Core service01 DI public Filter instance NET filter

Filter在ASP.NET Core中允许code在指定的请求阶段前或者后执行。

Filter在ASP.NET Core方法请求管道中运行,有时被称作filter pipeline,filter pipeline在ASP.NET Core选择Action执行。

 Filter 分类

每个filter type在filter pipeline的不同阶段执行。

AuthorizationFilter:

  • 第一个执行
  • 判断请求user是否被授权
  • 如果user没被授权则短路

ResourceFilter

  • 在Authorization Filter之后执行
  • OnResourceExecuting在模型绑定之前执行
  • OnResourceExcuted在其余管道运行之后执行

ActionFilter

  • 在Action执行前后立即执行
  • 可以改变传入action的参数
  • 可以改变action返回的结果

Endpoint Filter

  • 同ActionFilter
  • 可以在Action和路由处理Endpoint调用

ExceptionFilter

  • 应用全局policy处理在响应前不可预知的异常。

ResultFilter

  • 仅在Action成功执行后执行
  • 对于和view或者formatter紧密结合的逻辑很有用

Dependency injection

Filter可以以type或者instance的方式加入。如果是以instance的方式加入的,那么这个instance被用于每次reqquest;如果是以type的方式加入它是type-activated

什么是type-activated?

  • 每次request创建一个新的instance
  • 任何构造函数依赖都由DI populated。

下面Filters支持从DI的构造函数依赖

  • ServiceFilterAttribute

         Service filter需要在DI Container中注入,并从DI Container中检索instance。

[ServiceFilter(typeof(Demo01Attribute))]
public async Task<IActionResult> AttributeTest()
{
       await Task.CompletedTask;
       return Ok("Invoke Completely!");
}

      ServiceFilterAttribute及所依赖的service需要注入到DI Container中

builder.Services.AddTransient<Service01>();
builder.Services.AddTransient<Demo01Attribute>();

     ServiceFilterAttribute的实现类

public class Demo01Attribute : IAsyncActionFilter
{
    private readonly Service01 _service01;
    public Demo01Attribute(Service01 service01)
    {
        _service01 = service01;
    }
    public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        Console.WriteLine($"Run before Demo01 OnActionExecutionAsync, parameters: date:{_date}, class: {_className}.");
        _service01.Run();
        await next();
        Console.WriteLine("Run after Demo01 OnActionExecutionAsync");
    }
}

 Notes: ServiceFilterAttribute实现IFilterFactory, IFilterFactory暴露CreateInstance方法创建IFilterMetadata instance. CreateInstance从DI中检索指定的type.

  • TypeFilterAttribute

       TypeFitlerAttribute和ServiceFilterAttribute很像,但是instance不是直接从DI Container中创建的,它的instance是通过Microsoft.Extensions.DependencyInjection.ObjectFactory创建的

       因为TypeFitlerAttribute不是从DI Container中创建instance所以:

           1、TypeFilterAttribute filter不用注入到DI Container中,只需注入TypeFilterAttribute所需的service

           2、TypeFitlerAttribute可以选择性接收一些参数

[TypeFilter(typeof(Demo01Attribute), Arguments = new object[] {"20231102",nameof(Demo01Attribute) }, IsReusable = false)]
public async Task<IActionResult> AttributeTest()
{
      await Task.CompletedTask;
      return Ok("Invoke Completely!");
}

         TypeFitlerAttribute所需的Service注入到DI Container中

builder.Services.AddTransient<Service01>();

       TypeFilterAttribute接收参数

public class Demo01Attribute : IAsyncActionFilter
{
    private readonly Service01 _service01;
    private readonly string _date;
    private readonly string _className;
    public Demo01Attribute(string date, string className, Service01 service01)
    {
        _date = date;
        _className = className;
        _service01 = service01;
    }
    public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        Console.WriteLine($"Run before Demo01 OnActionExecutionAsync, parameters: date:{_date}, class: {_className}.");
        _service01.Run();
        await next();
        Console.WriteLine("Run after Demo01 OnActionExecutionAsync");
    }
}
  • IFilterFactory

       IFilterFactory 实现IFilterMetadata, 因此IFilterFactory instance可以在管道中替换任何IFitlerMetadata instance。

      IFilterFactory可以作为自定义的attribute创建filter

public class ResponseHeaderFilterFactory : Attribute, IFilterFactory
{
    public bool IsReusable => false;

    public IFilterMetadata CreateInstance(IServiceProvider serviceProvider) =>
        new InternalResponseHeaderFilter();

    private class InternalResponseHeaderFilter : IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContext context) =>
            context.HttpContext.Response.Headers.Add(
                nameof(OnActionExecuting), nameof(InternalResponseHeaderFilter));

        public void OnActionExecuted(ActionExecutedContext context) { }
    }

在Filter pipeline中使用中间件

用中间件作为filter,创建一个类包含Configure方法指定中间件注入到filter pipeline

public class FilterMiddlewarePipeline
{
    public void Configure(IApplicationBuilder app)
    {
        app.Use(async (context, next) =>
        {
            context.Response.Headers.Add("Pipeline", "Middleware");

            await next();
        });
    }
}

用MiddlewareFilterAttribute 运行middleware

[MiddlewareFilter(typeof(FilterMiddlewarePipeline))]
public async Task<IActionResult> AttributeTest()
{
       await Task.CompletedTask;
       return Ok("Invoke Completely!");
}

中间件filter和ResourceFilter运行在同一个阶段在模型绑定(model binding)之前运行。

 

标签:Core,service01,DI,public,Filter,instance,NET,filter
From: https://www.cnblogs.com/qindy/p/17805248.html

相关文章

  • .NET6 配置 AutoMapper 与 AutoFac
    AutoMapper 概述1、什么是AutoMapper简单来说,AutoMapper就是一个用C#语言开发的一个轻量的处理一个实体对象到另外一个实体对象映射关系的组件库 官网地址:AutoMapper 文档地址:AutoMapper—AutoMapperdocumentation 2、为什么要用AutoMapper层与层之间的数据转换......
  • highcharts network 网络图
    highchartsnetwork网络图要在边上加上箭头,十分困难?Re:HighChartsNetworkGraphArrowLinksWedJul15,20209:47amHi!Welcometoourforumandthanksforcontactinguswithyourquestion!FromtheAPI,thisoptionisnotpossible.Toachievethis,youhavetoext......
  • .net json 处理
    处理较复杂的Json字符串,不需要对Json进行序列化操作,以下是一种非常简单的方法,记录以下;Json字符串如下:{ "code":0, "msg":"SUCCESS", "result":[{ "changesContent":[{ "unionNo":"1719708390162472960", "orderDel......
  • api-ms-win-core-path-l1-1-0.dll下载(win7-32位)
      下载 api-ms-win-core-path-l1-1-0.dll 后拷贝到文件夹:32位系统 c:\windows\system32  下载链接: https://www.dll-files.com/api-ms-win-core-path-l1-1-0.dll.html ......
  • How to determine the correct number of epoch during neural network training? 如
     Thenumberofepochsisnotthatsignificant.Moreimportantisthethevalidationandtrainingerror.Aslongasitkeepsdroppingtrainingshouldcontinue.Forinstance,ifthevalidationerrorstartsincreasingthatmightbeaindicationofoverfittin......
  • 【Netty】使用Netty搭建简易Sokect客户端
    直接上代码创建客户端,连接到服务端,并发送消息:/**发送一条消息到socket服务端*/privatevoidsendOne(StringrawMessage){NioEventLoopGroupgroup=newNioEventLoopGroup();try{Bootstrapbootstrap=newBootstrap();......
  • net core流相关
      Stream.Read与StreamReader.Read都可以读取流中的信息///<summary>///将流中的内容以字节码的形式读出来///</summary>///<paramname="stream"></param>///<returns></returns>publics......
  • 模拟实现.net中的Task机制:探索异步编程的奥秘
    .net中使用Task可以方便地编写异步程序,为了更好地理解Task及其调度机制,接下来模拟Task的实现,目的是搞清楚:Task是什么Task是如何被调度的基本的Task模拟实现从最基本的Task用法开始Task.Run(Actionaction)这个命令的作用是将action作为一项任务提交给调度器,调度器会安排......
  • .NET6 使用AutoMapper
    .NET6使用AutoMapper 一、Net6环境下的.netcore项目里如何使用AutoMapper实现依赖注入。注:AutoMapper是一个对象-对象映射器,可以将一个对象映射到另一个对象。第一步,在Nuget引入AutoMapper、AutoMapper.Extensions.DependencyInjection这两个NuGet包  ......
  • 904-907 Prometheus自动发现机制 kube-state-metrics和metrics-server Prometheus监
    一、Prometheus自动发现机制服务发现机制:为了实现自动将被监控目标添加到PermethusPrometheus数据源的配置分为静态配置和动态发现,常见为以下几类:static_configs:静态服务发现,即将配置直接写到配置文件或Configmapfile_sd_config:文件服务器发现,创建一个专门配置target的配置文......