首页 > 编程语言 >在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作

在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作

时间:2024-09-28 22:24:35浏览次数:8  
标签:Core ASP Web 操作方法 next MyActionFilter 操作 筛选 执行

image

前言:什么是操作筛选器

操作筛选器是 ASP.NET Core Web API 中的一种过滤器,用于在执行控制器操作(Action)之前或之后执行一些代码,完成特定的功能,比如执行日志记录、身份验证、授权、异常处理等通用的处理逻辑。

每次 ASP.NET Core Web API 中控制器的操作方法被执行的时候,操作筛选器都会被执行,所以操作筛选器默认是应用于所有控制器的操作方法的。

一个项目中可以注册多个操作筛选器,这些操作筛选器组成一个链,上一个筛选器执行完了再执行下一个。next 就是一个用来指向下一个操作筛选器的委托,如果当前的操作筛选器是最后一个筛选器的话,next 就会执行要执行的操作方法。

操作筛选器跟前文(见《如何在 ASP.NET Core Web API 方法执行前后 “偷偷“ 作一些 “坏“ 事?初识 ActionFilterAttribute》)讲过的 ActionFilterAttribute 比较相似,ActionFilterAttribute 是用于将操作筛选器逻辑应用于控制器操作的一种方式,而操作筛选器是一种更广泛的概念,可以说,ActionFilterAttribute 是操作筛选器的一种特定实现方式,它通过特性的方式将操作筛选器逻辑应用于控制器操作。

Step By Step 步骤

  1. 创建一个 ASP.NET Core Web API 项目

  2. 编写两个自定义的操作筛选器 MyActionFilter1 和 MyActionFilter2,实现 IAsyncActionFilter 接口(注意看代码中的注释

    using Microsoft.AspNetCore.Mvc.Filters;
    
    public class MyActionFilter1 : IAsyncActionFilter
    {
    	// context 参数代表 Action 执行的上下文对象,从 context 中我们可以获取请求的路径、参数值等信息
    	// next 参数代表下一个要执行的操作筛选器
    	public async Task OnActionExecutionAsync(
    		ActionExecutingContext context, 
    		ActionExecutionDelegate next)
    	{
    		// next 之前的代码是在操作方法执行之前要执行的代码
    		Console.WriteLine("MyActionFilter 1:开始执行");
    
    		// 用 next 来执行下一个操作筛选器,
    		// 如果这是最后一个操作筛选器,它就会执行实际的操作方法
    		// next 的返回值是操作方法的执行结果,返回值是 ActionExecutedContext 类型的。
    		// 如果操作方法执行的时候出现了未处理异常,
    		// 那么 ActionExecutedContext 的 Exception 属性就是异常对象,
    		// ActionExecutedContext 的 Result 属性就是操作方法的执行结果。
    		ActionExecutedContext r = await next();
    		
    		// 以下代码则是在操作方法执行之后要执行的代码
    		if (r.Exception != null)
    		{
    			Console.WriteLine("MyActionFilter 1:执行失败");
    		}
    		else
    		{
    			Console.WriteLine("MyActionFilter 1:执行成功");
    		}
    	}
    }
    
    public class MyActionFilter2 : IAsyncActionFilter
    {
    	public async Task OnActionExecutionAsync(
    		ActionExecutingContext context, 
    		ActionExecutionDelegate next)
    	{
    		Console.WriteLine("MyActionFilter 2:开始执行");
    		ActionExecutedContext r = await next();
    		if (r.Exception != null)
    		{
    			Console.WriteLine("MyActionFilter 2:执行失败");
    		}
    		else
    		{
    			Console.WriteLine("MyActionFilter 2:执行成功");
    		}
    	}
    }
    
  3. 打开 Program.cs,注册这两个操作筛选器

    using Microsoft.AspNetCore.Mvc;
    
    var builder = WebApplication.CreateBuilder(args);
    
    // Add services to the container.
    
    builder.Services.AddControllers();
    // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
    builder.Services.AddEndpointsApiExplorer();
    builder.Services.AddSwaggerGen();
    
    // 注册操作筛选器服务
    builder.Services.Configure<MvcOptions>(options => {
    	options.Filters.Add<MyActionFilter1>();
    	options.Filters.Add<MyActionFilter2>();
    });
    
    var app = builder.Build();
    
    // Configure the HTTP request pipeline.
    if (app.Environment.IsDevelopment())
    {
    	app.UseSwagger();
    	app.UseSwaggerUI();
    }
    
    app.UseHttpsRedirection();
    
    app.UseAuthorization();
    
    app.MapControllers();
    
    app.Run();
    
  4. 打开控制器,增加一个用于测试的操作方法

    using Microsoft.AspNetCore.Mvc;
    
    namespace 操作筛选器.Controllers
    {
    	[ApiController]
    	[Route("[controller]/[action]")]
    	public class TestController : ControllerBase
    	{
    		[HttpGet]
    		public string GetData()
    		{
    			Console.WriteLine("执行GetData");
    			return "yzk";
    		}
    	}
    }
    

测试运行和结果

执行顺序:
MyActionFilter 1:开始执行
MyActionFilter 2:开始执行
执行GetData
MyActionFilter 2:执行成功
MyActionFilter 1:执行成功

我是老杨,一个执着于编程乐趣、至今奋斗在一线的 10年+ 资深研发老鸟,是软件项目管理师,也是快乐的程序猿,持续免费分享全栈实用编程技巧、项目管理经验和职场成长心得!欢迎关注老杨的公众号(名称:代码掌控者),和你共同探索代码世界的奥秘!

image

标签:Core,ASP,Web,操作方法,next,MyActionFilter,操作,筛选,执行
From: https://www.cnblogs.com/JackyGz/p/18438519

相关文章

  • 【CTF Web】Pikachu 反射型xss(get) Writeup(反射型XSS+GET请求)
    XSS(跨站脚本)概述Cross-SiteScripting简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS。一般XSS可以分为如下几种常见类型:1.反射性XSS;2.存储型XSS;3.DOM型XSS;XSS漏洞一直被评估为web漏洞中危害较大的漏洞,在OWASPTOP10的排名中一直属于前三的江湖地位......
  • 【CTF Web】BUUCTF SQLi-LABS Page-1(Basic Challenges) Less-12 Writeup(SQL注入+POST
    sqli-labs1点击启动靶机。SQLi-LABSPage-1(BasicChallenges)解法随便提交一些数据。审查元素。<formaction=""name="form1"method="post"> <divstyle="margin-top:15px;height:30px;">Username:&nbsp;&nbsp;&......
  • javaweb学习4
    今天主要学习了获取数据库连接的操作和mavenmaven导入mysql和druidjar包具体的jar坐标可以去这个网站找https://mvnrepository.com/<dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId......
  • 在Ubuntu 20.04上安装Apache Web服务器的方法
    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。介绍ApacheHTTP服务器是世界上使用最广泛的Web服务器。它提供许多强大的功能,包括动态可加载模块、强大的媒体支持以及与其他流行软件的广泛集成。在本指南中,我们将解......
  • 基于JavaWeb技术的在线考试系统设计与实现(11551)
     有需要的同学,源代码和配套文档领取,加文章最下方的名片哦一、项目演示项目演示视频二、资料介绍完整源代码(前后端源代码+SQL脚本)配套文档(LW+PPT+开题报告)远程调试控屏包运行三、技术介绍Java语言SSM框架SpringBoot框架Vue框架JSP页面Mysql数据库IDEA/Eclipse开发四、项......
  • C# ASP.NET Core Web API 框架 实现向手机发送验证码短信
    本文章主要是在C#ASP.NETCoreWebAPI框架实现向手机发送验证码短信功能。这里我选择是一个互亿无线短信验证码平台,其实像阿里云,腾讯云上面也可以。首先我们先去互亿无线https://www.ihuyi.com/api/sms.html去注册一个账号注册完成账号后,它会送10条免费短信以及通话验证......
  • DCDC电源设计工具(软件)(一)—— WEBENCH(TI)
    目录一、简介二、在线链接三、设计界面介绍1、首界面2、芯片选择或芯片选型界面3、根据参数选择芯片及设计(1)参数输入界面(2)芯片选型界面(3)根据具体芯片型号选择设计   ①、芯片选择及参数输入界面        ②、TPS54331电源设计详情四、验证设计五、软......
  • DC00020基于springboot新闻网站系统java web项目MySQL新闻管理系统
    1、项目功能演示DC00020基于springboot新闻网站系统javaweb项目MySQL2、项目功能描述  基于springboot+vue新闻网站包括用户和系统管理员两个角色。2.1用户功能1、用户登录、用户注册2、新闻信息:点赞、点踩、收藏、查看3、用户分享:点赞、点踩、收藏、查看、添加......
  • ctfshow-web-信息搜集(11-17)
    web11题目提示:域名其实也可以隐藏信息,比如ctfshow.com就隐藏了一条信息。原理:通过Dns检查查询Flag。这里可以用阿里云的网站:Dns查询网站:阿里云网站运维检测平台(aliyun.com)web12题目提示:有时候网站上的公开信息,就是管理员常用密码原理:查看robots.txt文件,找到后台登录页......
  • 通过torndao 起一个web服务
    需要安装包tornado==6.4.1redis==4.3.3示例代码importtornado.ioloopimporttornado.webfromredis.asyncioimportRedisclassMainHandler(tornado.web.RequestHandler):asyncdefget(self):key=self.get_argument("key","default_key......