net core Webapi基础工程搭建(七)——小试AOP及常规测试_Part 1
前言
一天天不知道怎么过的,但确实挺忙,事赶事不带停那种,让我感觉跟在流水线干活一样,忙活的事差不多了就喘口气继续补充这一系列的内容,前面几篇基本上把一个常规的后端服务搭建差不多了,后面的会时不时根据自己需要或者常规的测试内容来一点点完善更新。
拦截器
这里先不提AOP的内容,其实在我个人之前的理解,AOP开发的思想就是,我们做的某些操作例如身份验证,日志记录,异常抓捕等等这些操作,可以单独拎出来放那,谁用了加个头部标识就可以了,剩余的交给代码来处理,这样我们开发就只需要关心业务功能,而其他的全都可以不用考虑,这就是框架的好处,别人封装集成好,就可以省去很大的开发工作量。
好,开始说拦截器,其实也是中间层,个人感觉跟AOP的概念类似,就放到这里写上了。
异常拦截器
在我们Api的工程目录下新建文件夹Filters用于存放拦截器,之后我们新建ExceptionFilter这个异常的拦截器,用于记录工程抛异常并做对应回调处理。
代码如下,具体不过多解释,因为实在觉得这个没啥说的,只是注意异步调用的问题即可。
public class ExceptionFilter
{
private readonly RequestDelegate _next;
/// <summary>
///
/// </summary>
/// <param name="next"></param>
public ExceptionFilter(RequestDelegate next)
{
_next = next;
}
/// <summary>
///
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public async Task Invoke(HttpContext context)
{
try
{
await _next(context);
}
catch (Exception ex) //发生异常
{
context.Response.StatusCode = 500;
LogUtil.Error($"response exception:{ex.Message}");// {ex.StackTrace}
await ResponseUtil.HandleExceptionAsync(500, "服务器错误");
}
}
}
这个地方的ResponseUtil是单独在Util层创建的(公共类尽量扔到同一个工程类库下,以后一键打包,各种复用)。
public class ResponseUtil
{
/// <summary>
/// 回调
/// </summary>
/// <param name="statusCode">html状态码</param>
/// <param name="msg">消息</param>
/// <returns></returns>
public static Task HandleExceptionAsync(int statusCode, string msg)
{
var data = new { code = statusCode, msg = msg };
string text = JsonConvert.SerializeObject(data);
var response = AprilConfig.HttpCurrent.Response;
if (string.IsNullOrEmpty(response.ContentType))
{
//跨域的时候注意,不带header没法接收回调
response.Headers.Add("Access-Control-Allow-Origin", "*");
response.Headers.Add("Access-Control-Allow-Credentials", "true");
//因为这个是json
response.ContentType = "application/json;charset=utf-8";
response.StatusCode = 200;
response.ContentLength = text.Length;
return response.WriteAsync(text);
}
else
{
return response.WriteAsync(text);
}
}
}
之后我们依然要在Startup中注册我们这个中间层。
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseMiddleware<ExceptionFilter>();
…
}
这样我们在全局如果出现异常的时候,可以统一捕获到问题,然后做记录,当然在测试环境下注意,如果这个错误帮助页打开的时候,那上面的拦截器将毫无乱用。

测试结果


这样如果真是哪个地方没有做异常捕获,全局最终都会一个不漏的抓住然后告诉你,好处是如果懒那就所有地方都不写了,问题是有些异常即使捕获但是不需要告知用户也不需要做记录(比如文件上传下载的线程中断异常之类的),所以这个只是为了保险起见而不是为了省事。
身份验证拦截器
接下来我们继续创建一个AuthFilter,目的是做身份验证的判断,如果没通过就没必要再进入具体的控制器了。
public class AuthFilter
{
private readonly RequestDelegate _next;
public AuthFilter(RequestDelegate next)
{
_next = next;
}
public Task Invoke(HttpContext context)
{
if (context.Request.Method == "OPTIONS")
{
return _next(context);
}
var headers = context.Request.Headers;
//检查头文件是否有jwt token
if (!headers.ContainsKey("Authorization"))
{
string path = context.Request.Path.Value;
if (!AprilConfig.AllowUrl.Contains(path) && path.IndexOf("swagger") < 0)
{
//这里做下相关的身份校验
return ResponseUtil.HandleExceptionAsync(401, "请登录");
//判断是否有权限查看(在身份验证后判断对应的权限,这个方法后续再写)
return ResponseUtil.HandleExceptionAsync(-2, "无权访问");
}
}
return _next(context);
}
}
同样我们需要在Startup注册使用中间层。
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseMiddleware<ExceptionFilter>();
app.UseMiddleware<AuthFilter>();
…
}
测试

然后访问我们的Swagger,效果就很明显了。

小结
这一篇主要就是引入中间层的使用,个人认为什么AOP开发OOP开发完全因人而异,没必要为了追求新技术而去整体大功能改造,新技术确实使用起来方便,也有很好的前景,但是对于企业来讲,稳定是最重要的,不会为了1%的性能速度而去冒30%甚至更高的风险,但是我还是要说一句,net core到目前为止已经历过一个大版本的更新,虽然3.0没有正式发布,但是一个个版本的更新之后,稳定性已经很ok了,所以该吃螃蟹都可以动手了。
下一篇,继续引入AOP的开发,主要用的第三方的组件AspectCore,将针对接口调用的时候做一些常规操作。
补充 2019-07-31
今天在做调试的时候发现一个问题,现状如下

发现这个问题我的第一反应是,字符编码,但是看到我回调的时候明显已经设置了ContentType,所以这个应该不是错误的原因,但是多次刷新的测试结果是偶尔正常,怪异的情况总是伴随着bug,于是比对了正确的回调信息和错误的回调信息(这里是通过chrome浏览器调试然后获取的回调信息,具体调试方法后续前端介绍,当然基本上都知道)。

这样一看发现了问题所在,所以这个地方决定不再自主去设置Length了。

net core Webapi基础工程搭建(七)——小试AOP及常规测试_Part 1的更多相关文章
- net core Webapi基础工程搭建(六)——数据库操作_Part 2
目录 前言 开始 使用 小结 前言 昨天是写着写着发现,时间不早了,已经养成了晚上下班抽时间看看能写点儿啥的习惯(貌似),今天实在是不想让昨天没做完的事情影响,所以又坐下,沉下心(周末了),开始把数据 ...
- net core Webapi基础工程搭建(六)——数据库操作_Part 1
目录 前言 SqlSugar Service层 BaseService(基类) 小结 前言 后端开发最常打交道的就是数据库了(静态网站靠边),上一篇net core Webapi基础工程搭建(五)-- ...
- net core Webapi基础工程搭建(七)——小试AOP及常规测试_Part 2
目录 前言 引入 自定义属性 测试 小结 前言 前一篇讲到了中间层的使用,可能不是那么AOP,今天主要来说下一个轻量级的AOP第三方类库AspectoCore. 简单介绍下这个类库,AspectCor ...
- net core Webapi基础工程搭建(五)——缓存机制
目录 前言 Cache Session Cookie 小结 补充 前言 作为WebApi接口工程,性能效率是必不可少的,每次的访问请求,数据库读取,业务逻辑处理都或多或少耗费时间,偶尔再来个各种花式f ...
- net core Webapi基础工程搭建(二)——创建工程
目录 前言 创建工程 工程文件概述(个人理解) 运行 小结 前言 前面介绍了开发工具及net core版本,后端工程的框架结构开发工具及环境,因为是基础工程,所以没考虑太复杂的框架,如果有架构师请勿喷 ...
- net core Webapi基础工程搭建(一)——开发工具及环境
目录 开发工具 版本 后端框架 开发工具 Visual Studio 2019,既然要折腾那就体验最新版的开发工具有什么特殊的地方,之前个人开发使用的是2017. 下载地址:https://visua ...
- net core Webapi基础工程搭建(四)——日志功能log4net
目录 前言 log4net 依然是,NuGet引用第三方类库 整合LogUtil 小结 前言 一个完整的项目工程离不开日志文件的记录,而记录文件的方法也有很多,可以自己通过Stream去实现文件的读写 ...
- net core Webapi基础工程搭建(三)——在线接口文档Swagger
目录 前言 Swagger NuGet引用第三方类库 别急,还有 没错,注释 小结 前言 前后分离的好处,就是后端埋头做业务逻辑功能,不需要过多考虑用户体验,只专注于数据.性能开发,对于前端需要的数据 ...
- 第十九节:Asp.Net Core WebApi基础总结和请求方式
一. 基础总结 1.Restful服务改造 Core下的WebApi默认也是Restful格式服务,即通过请求方式(Get,post,put,delete)来区分请求哪个方法,请求的URL中不需要写方 ...
随机推荐
- Spring框架之IoC和AOP
Spring框架简介: 2003年2月,Spring框架正式成为一个开源项目,并发布于SourceForge中.致力于Java EE应用的各种解决方案,而并不是仅仅专注于某一层的方案,是企业应用开发的 ...
- Android studio 混淆打包安装后报错NullPointerException int java.util.List.size()
菜鸟的我,尝试混淆打包app...打包之前没有什么问题,混淆打包之后遇到各种问题.首先,感谢原博主的分享.解决了我的问题.谢谢. 原文地址:http://blog.csdn.net/tou_star/ ...
- MongoDB 启动时关于 NUMA 警告 的分析----(To avoid performance problems)
1. 需求描述 观察MongoDB的启动Log,会看到一个关于 NUMA 的警告 和 优化建议 --17T17:: I CONTROL [initandlisten] ** WARNING: You ...
- LeetCode_32
LeetCode 32 题目描述: 给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度. 示例 1: 输入: "(()" 输出: 2 解释: 最长有效 ...
- liunx软件安装与网络管理和远程访问
三.软件安装1.RPM包管理器进行软件安装 语法:rpm[选项][软件包] -i 安装一个以前从来未安装过的软件包 -v 将安装过程打印在屏幕上 -h 以字符“#”显示安装进度条 rpm -q[软件包 ...
- Java--ASCII码
ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧 ...
- 在pom.xml中的dependencies点击add怎么没有搜索到相关jar包
1.eclipse菜单 window-> show view –> other –> Maven 2.在打开的窗口里,右键 local repositories –> loca ...
- .Net MVC 动态生成LayUI tree
.Net MVC 动态生成LayUI tree 最近在做项目的过程中需要用到Tree插件,所以找了一堆Tree发现LayUI的Tree样式比较好看,所以开始搞! 1.Layui部分 1.1 首先引用文 ...
- springboot - 登录+静态资源访问+国际化
1.项目目录结构 2.pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmln ...
- 2019牛客暑期多校训练营(第四场)K.number
>传送门< 题意:给你一个字符串s,求出其中能整除300的子串个数(子串要求是连续的,允许前面有0) 思路: >动态规划 记f[i][j]为右端点满足mod 300 = j的子串个数 ...