C# Web开发教程(七)切面编程

news/2025/10/21 15:14:06/文章来源:https://www.cnblogs.com/qinganning/p/19155438

切面编程: 在项目中的某一处,执行我们自定义的代码!

  • 比如说自定义异常,先简单写一个接口,触发系统自带异常
using Microsoft.AspNetCore.Mvc;namespace WebApplicationAboutCustomCode.Controllers
{[Route("api/[controller]/[action]")][ApiController]public class Test1Controller : ControllerBase{[HttpGet]public string Test1(){// 访问一个并不存在的文件string s = System.IO.File.ReadAllText("d:/123.txt");return s;}}
}- 结果,触发系统自带异常: System.IO.FileNotFoundException:“Could not find file 'd:\123.txt'.”
  • 现在,自定义异常,比如统一返回{"code":500,"message":"xxx"}这种格式
// MyExceptionFilter.csusing Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;namespace WebApplicationAboutCustomCode
{public class MyExceptionFilter:IAsyncExceptionFilter{private readonly IWebHostEnvironment hostEnv;public MyExceptionFilter(IWebHostEnvironment hostEnv){this.hostEnv = hostEnv;}public Task OnExceptionAsync(ExceptionContext context){string msg;if (hostEnv.IsDevelopment()){msg = context.Exception.ToString();Console.WriteLine("触发开发环境异常");}else{msg = "服务端发生未知处理异常";}ObjectResult objResult = new ObjectResult(new { code = 500, message = msg });context.Result = objResult;context.ExceptionHandled = true;return Task.CompletedTask;}}
}// LogExceptionFilter.csusing Microsoft.AspNetCore.Mvc.Filters;namespace WebApplicationAboutCustomCode
{public class LogExceptionFilter: IAsyncExceptionFilter{public Task OnExceptionAsync(ExceptionContext context){return File.AppendAllTextAsync("d:/error.log", context.Exception.ToString());}}
}// Program.cs
......
builder.Services.AddSwaggerGen();builder.Services.Configure<MvcOptions>(opt =>
{	// 这里注意顺序opt.Filters.Add<MyExceptionFilter>();opt.Filters.Add<LogExceptionFilter>();});// 接口程序using Microsoft.AspNetCore.Mvc;namespace WebApplicationAboutCustomCode.Controllers
{[Route("api/[controller]/[action]")][ApiController]public class Test1Controller : ControllerBase{[HttpGet]public string Test1(){// 主动触发异常string s = System.IO.File.ReadAllText("d:/123.txt");return s;}}
}

切面编程(AOP)在 ASP.NET Core 中的实现

这段代码演示了如何使用过滤器(Filters) 在 ASP.NET Core 中实现切面编程(AOP)的概念。

核心概念解释

什么是切面编程(AOP)?

切面编程是一种编程范式,允许开发者在不修改原有业务代码的情况下,在程序的特定执行点插入自定义逻辑。就像"切一刀"进去执行额外代码。

代码详细解析

1. 原始问题代码

[HttpGet]
public string Test1()
{// 访问一个并不存在的文件,会抛出异常string s = System.IO.File.ReadAllText("d:/123.txt");return s;
}

问题:直接抛出系统异常,用户体验差,没有统一的错误处理。

2. 自定义异常过滤器

MyExceptionFilter - 主要异常处理器

public class MyExceptionFilter : IAsyncExceptionFilter
{private readonly IWebHostEnvironment hostEnv;public MyExceptionFilter(IWebHostEnvironment hostEnv){this.hostEnv = hostEnv;}public Task OnExceptionAsync(ExceptionContext context){string msg;// 根据环境决定错误信息详细程度if (hostEnv.IsDevelopment()){msg = context.Exception.ToString();  // 开发环境:详细错误Console.WriteLine("触发开发环境异常");}else{msg = "服务端发生未知处理异常";  // 生产环境:友好提示}// 创建统一格式的响应ObjectResult objResult = new ObjectResult(new { code = 500, message = msg });context.Result = objResult;      // 设置返回结果context.ExceptionHandled = true; // 标记异常已处理,阻止继续传播return Task.CompletedTask;}
}

作用

  • 捕获控制器中未处理的异常
  • 根据运行环境返回不同的错误信息
  • 统一响应格式:{ code: 500, message: "..." }

LogExceptionFilter - 日志记录器

public class LogExceptionFilter : IAsyncExceptionFilter
{public Task OnExceptionAsync(ExceptionContext context){// 将异常信息写入日志文件return File.AppendAllTextAsync("d:/error.log", context.Exception.ToString());}
}

作用

  • 专门负责记录异常日志
  • 将异常详细信息写入文件

3. 注册过滤器

builder.Services.Configure<MvcOptions>(opt =>
{opt.Filters.Add<MyExceptionFilter>();  // 第一个执行opt.Filters.Add<LogExceptionFilter>(); // 第二个执行
});

执行顺序很重要

  1. MyExceptionFilter 先执行,处理异常并设置响应
  2. LogExceptionFilter 后执行,记录日志

执行流程

sequenceDiagramparticipant Client as 客户端participant Controller as Test1Controllerparticipant Filter1 as MyExceptionFilterparticipant Filter2 as LogExceptionFilterparticipant Response as 响应Client->>Controller: GET /api/Test1/Test1Controller->>Controller: 执行Test1()方法Controller->>Controller: 抛出FileNotFoundExceptionNote over Controller: 异常发生,开始过滤器链Controller->>Filter1: 触发OnExceptionAsyncNote over Filter1: 处理异常<br/>设置统一响应格式<br/>标记异常已处理Filter1->>Filter2: 继续执行下一个过滤器Note over Filter2: 记录异常到日志文件Filter2->>Response: 返回处理后的响应Response->>Client: { "code": 500, "message": "..." }

切面编程的优势

1. 关注点分离

  • 业务代码:只关注核心逻辑(读取文件)
  • 横切关注点:异常处理、日志记录单独处理

2. 代码复用

// 这个过滤器会自动应用到所有Controller的所有Action
// 不需要在每个方法中写try-catch

3. 维护性

修改异常处理逻辑只需修改过滤器,不影响业务代码。

4. 一致性

所有异常都按照统一格式返回,前端处理更简单。

实际效果对比

修改前:

HTTP/1.1 500 Internal Server Error
System.IO.FileNotFoundException: Could not find file 'd:\123.txt'.

修改后:

{"code": 500,"message": "System.IO.FileNotFoundException: Could not find file 'd:\\123.txt'."
}

扩展应用场景

这种切面编程思想还可以用于:

  1. 身份认证:在进入业务方法前验证用户权限
  2. 性能监控:记录每个方法的执行时间
  3. 缓存:在方法执行前检查缓存
  4. 数据验证:统一验证请求参数
  5. 事务管理:自动管理数据库事务

总结

这个例子完美展示了切面编程的核心价值

  • 非侵入式:不改动原有业务代码
  • 集中管理:异常处理逻辑集中在一处
  • 灵活配置:根据不同环境返回不同信息
  • 职责分离:业务逻辑与横切关注点分离

通过过滤器机制,ASP.NET Core 提供了强大的 AOP 支持,让开发者能够优雅地处理这类"横切关注点"问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/942311.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第十六章:固本培元,守正出奇——Template Method的模板艺术 - 教程

第十六章:固本培元,守正出奇——Template Method的模板艺术 - 教程2025-10-21 15:08 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto …

实用指南:点鼠标左键一下变两下怎么回事?真相和解决方案

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

设计模式(C++)详解——策略模式(2) - 指南

设计模式(C++)详解——策略模式(2) - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

粗略写一个计算器 实现加减乘除 - I

//作业:写一个计算器,要求实现加减乘除功能,并且能够循环接受新的数据,通过用户交互实现 package com.zhang.method;import java.util.Scanner;public class homeworkDemo {public static void main(String[] args…

WPF使用MediaCapture开发相机应用(三、相机拍照)

上期弄好了相机的预览功能,现在可以进行拍照了。对上期有疑惑的点这里。 MediaCapture的教程是用UWP写的,教程里拍照是用MediaCapture.CapturePhotoToStorageFileAsync方法,老实说我研究了好久都没搞明白WPF什么创建…

2025年磨粉机厂家权威推荐榜:雷蒙磨粉机/环辊磨粉机/摆式磨粉机/矿石磨粉机/超细磨粉机/高压磨粉机,专业实力与高效生产之选

2025年磨粉机厂家权威推荐榜:雷蒙磨粉机/环辊磨粉机/摆式磨粉机/矿石磨粉机/超细磨粉机/高压磨粉机,专业实力与高效生产之选 在工业制造领域,磨粉设备作为物料加工的核心装备,其技术水平直接影响着生产效率和产品质…

我的第一份开源贡献:小米工程师程赛的社区之旅

打开链接点亮社区Star,照亮技术的前进之路。每一个点赞,都是社区技术大佬前进的动力Github 地址: https://github.com/secretflow/secretflow他是从校园走进开源世界的年轻工程师; 他在小米工作,却把开源当成生活…

2025陶瓷过滤机实力厂家推荐,铜陵杰达机械专注固液分离设备制造

2025陶瓷过滤机实力厂家推荐,铜陵杰达机械专注固液分离设备制造 固液分离领域的技术挑战与创新突破 在当前的工业生产中,固液分离设备作为关键环节,面临着诸多技术挑战。根据行业数据显示,传统过滤设备在处理微细颗…

2025信息流代运营公司推荐:线尚网络专注效果营销与品牌增长

2025信息流代运营公司推荐:线尚网络专注效果营销与品牌增长 信息流代运营领域面临的技术挑战 随着数字营销进入深水区,信息流代运营行业正面临前所未有的技术挑战。据行业数据显示,超过67%的企业在信息流广告投放中…

2025冷链解冻设备厂家推荐广东科恩,专业定制高湿静电解冻方案

2025冷链解冻技术新突破:专业定制高湿静电解冻方案引领行业变革 在食品工业快速发展的今天,解冻设备作为冷链环节中的重要组成部分,其技术水平直接影响着食品品质与安全。随着2025年的临近,冷链解冻设备行业正迎来…

SecureCRT 批量创建会话-cnblog

SecureCRT 批量创建会话 前言: 在使用CRT的过程中,如果需要创建大量的会话连接 如:使用telnet连接ensp的网络设备 如:一次性需要连接多台linux主机 开篇: 下载SecureCRT:https://www.vandyke.com/download/ 这里…

2025干燥设备厂家权威推荐:常州亿干专业定制实验室喷雾与真空耙式干燥机

2025干燥设备厂家权威推荐:常州亿干专业定制实验室喷雾与真空耙式干燥机 一、干燥设备行业面临的技术挑战 在当今工业生产领域,干燥设备作为关键工艺装备,其技术水平直接影响着产品质量和生产效率。小型喷雾干燥机、…

2025磨粉机厂家权威推荐:海城八里镇机械厂专注矿石超细研磨设备制造

2025磨粉机厂家权威推荐:海城八里镇机械厂专注矿石超细研磨设备制造 行业技术挑战与创新需求 在当前的工业制造领域,磨粉设备的技术革新正面临着前所未有的挑战。随着矿产资源的深度开发和精细化加工需求的提升,传统…

Vue技术之Vxe-Table的虚拟滚动

虚拟滚动 纵向虚拟滚动:scroll-y 横向虚拟滚动:scroll-x 1.首先留意项目中使用的版本,我这边在项目用的是"vxe-pc-ui": "4.0.95"版本"vxe-table": "4.7.65"版本 所以scrol…

实用指南:一次借助ChatGPT抵御恶意攻击的经历,为个人服务器添加自动防御系统Fail2ban

实用指南:一次借助ChatGPT抵御恶意攻击的经历,为个人服务器添加自动防御系统Fail2banpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important;…

Docker补充

Docker知识点学习。目录Docker实际应用docker 管理镜像操作容器操作Dockerfile命令学习一些Docker的图解 Docker实际应用 docker 管理 镜像操作搜索对应镜像docker serarch xxx查看现有镜像docker images docker imag…

【QNX】Socket ServerClient 源代码

1 Socket Server 源代码 服务端计划只启动一个线程,所以功能实现时使用了一些全局变量。1 int32_t skt_s_listen_fd{-1};2 pthread_t thr_server;3 struct sockaddr_un srv_addr;4 struct sockaddr_un cli_addr;5 std…

Linux环境--文件系统--动静态库

Linux环境--文件系统--动静态库2025-10-21 14:44 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !importa…