Mbp通过筛选器和中间件实现异常,日志,事务及接口返回数据格式化aop处理.
Mbp应用服务层的AOP实现
实现方法:asp.net core mvc 筛选器 + 中间件
日志,事务,和接口返回结果统一格式化采用操作筛选器,而异常处理采用中间件来处理.
最开始,我是打算用autofac的高级特性的拦截器来做AOP的,但是遇到一个问题,poco controller没办法注入到autofac的容器里面.导致拦截器不能正常工作,所以就采用了筛选器来做.这里的场景有以下几个:
- AOP是在应用层,而应用层是用poco controller做的,而在asp.net core web api的基架中,controller处在管线的末端.所以可以在这层进行全局拦截.
- 中间件处理异常更加灵活,可以有更多的定制化需求,而异常筛选器是响应抓捕的异常来处理,它相当于是异常发生后的一个处理程序,而中间件可以来实现类似异常筛选器.
- 中间件不短路,只是在程序运行的管线上添加了try catch,同时也解决了异步方法出现的异常无法被捕获的问题.
实现代码
- Mbp.AspNetCore.Filter 添加MbpLogFilter,MbpTransActionFilter,ResponseMiddleware三个操作筛选器
- Mbp.AspNetCore.Middleware 添加MbpGlobaExceptionMiddleware中间件
- 在模块MbpAspNetCoreModule中注册筛选器和中间件
public override IServiceCollection AddServices(IServiceCollection services)
{
services.AddMvc().AddNewtonsoftJson(options =>
{
// 忽略循环引用
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
// 不使用驼峰
options.SerializerSettings.ContractResolver = new DefaultContractResolver();
// 设置时间格式
options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
}).AddMvcOptions(options =>
{
// 禁用Version的绑定
options.ModelMetadataDetailsProviders.Add(new ExcludeBindingMetadataProvider(typeof(System.Version)));
// 统一事务处理中间件
options.Filters.Add(typeof(MbpTransActionFilter));
// 统一日志处理中间件
options.Filters.Add(typeof(MbpLogFilter));
// 请求响应统一格式处理中间件
options.Filters.Add(typeof(ResponseMiddleware));
}); ;
AddAutoWebApi(services, new AutoWebApiOptions());
// 创建Cors策略
services.AddCors(options =>
{
options.AddPolicy("MbpCors",
builder =>
{
builder.WithOrigins(services.BuildServiceProvider().GetService<IConfiguration>().GetSection("AllowedHosts").Value)
.AllowAnyMethod()
.AllowAnyHeader(); ;
});
});
return base.AddServices(services);
}
public override void UseModule(IApplicationBuilder app)
{
// 启用跨域请求中间件
app.UseCors("MbpCors");
// 启用应用服务层全局错误处理中间件
app.UseMiddleware(typeof(MbpGlobaExceptionMiddleware));
base.UseModule(app);
}
异常中间件对并发冲突进行单独处理
public async Task InvokeAsync(HttpContext context, ILogger<MbpGlobaExceptionMiddleware> logger)
{
try
{
// Call the next delegate/middleware in the pipeline
await _next(context);
}
catch (DbUpdateConcurrencyException ex)
{
// 发生冲突时候,牺牲后者.不做具体数据合并操作.提示当前用户数据已经发生修改,需要重试.
logger.LogError("并发冲突:" + ex.Message);
context.Response.ContentType = "application/json";
await context.Response.WriteAsync(JsonConvert.SerializeObject(new { Code = 500, Message = "提交并发冲突", Version = "1", Data = new List<object>() }));
}
catch (Exception ex)
{
// 其他异常
logger.LogError($"请求[{context.Request.Path}]发生异常:" + ex.Message);
context.Response.ContentType = "application/json";
await context.Response.WriteAsync(JsonConvert.SerializeObject(new { Code = 500, Message = "服务器异常", Version = "1", Data = new List<object>() }));
}
}
代码详细地址:https://github.com/mbpframework/Mbp
Mbp通过筛选器和中间件实现异常,日志,事务及接口返回数据格式化aop处理.的更多相关文章
- WebApi自定义全局异常过滤器及返回数据格式化
WebApi在这里就不多说了,一种轻量级的服务,应用非常广泛.我这这里主要记录下有关 WebApi的相关知识,以便日后使用. 当WebApi应用程序出现异常时,我们都会使用到异常过滤器进行日志记录,并 ...
- springboot 接口返回数据时 net.sf.json.JSONNull["empty"]) 异常
@ResetController返回数据时出现异常 Could not write JSON: Object is null; nested exception is com.fasterxml.ja ...
- MVC四大筛选器—ActionFilter&ResultedFilter
AuthorizeFilter筛选器 在Action的执行中包括两个重要的部分,一个是Action方法本身逻辑代码的执行,第二个就是Action方法的筛选器的执行. MVC4中筛选器都是以AOP(面向 ...
- ISAPI筛选器及对ASP源文件的保护
ISAPI筛选器及对ASP源文件的保护 2009-04-21 01:45:57 标签:ISAPI 筛选器 ASP 源文件 保护 摘要:本文介绍了利用ISAPI筛选器保护ASP源文件的方法,并给出一个实 ...
- MVC四大筛选器—AuthorizeFilter
在Action的执行中包括两个重要的部分,一个是Action方法本身逻辑代码的执行,第二个就是Action方法的筛选器的执行. MVC4中筛选器都是以AOP(面向方面编程)的方式来设计的,通过对Act ...
- 如何添加筛选器 (Reporting Services)
如果您希望在计算或显示时包含或排除特定值,可向数据集.数据区域或组添加筛选器.在运行时应用筛选器的顺序为:先对数据集,再对数据区域,最后对组,并按照组层次结构自上而下的顺序.在表.矩阵或列表中,对行组 ...
- Magicodes.IE之导入导出筛选器
总体设计 Magicodes.IE是一个导入导出通用库,支持Dto导入导出以及动态导出,支持Excel.Word.Pdf.Csv和Html.在本篇教程,笔者将讲述如何使用Magicodes.IE的 ...
- Asp.net Core 异常日志与API返回值处理
需求: 1.对异常进行捕获记录日志 并且修改返回值给前端 解释: ILogger4是自定义的一个日志,更改它就好 解决方案1: 使用中间件进行异常捕获并且修改其返回值 public class Err ...
- C# 之 读取Word时发生 “拒绝访问” 及 “消息筛选器显示应用程序正在使用中” 异常的处理
1.Asp.net中建立Microsoft.Office.Interop.Word.Application时出现 “ 拒绝访问 ” 错误 项目中要实现在服务器端打开一个Word模版文件,修改其内容后再 ...
随机推荐
- 【python安装】错误——“User installations are disabled via policy on the machine”
报错界面: 解决方法一: 1.在运行里输入gpedit.msc; 2.计算机配置管理>>管理模板>>windows组件>>windows Installer&g ...
- 第二阶段:4.商业需求文档MRD:1.PRD-产品功能列表
这就是对功能清单的梳理已经优先级筛选
- mac如何查看已连接wifi的密码
可以通道mac自带的“钥匙串访问”功能查看.选择需要查询的wifi名称,右击选择“将密码拷贝到剪贴板”,输入管理员密码后,密码就拷贝好了. 找个地方粘贴即可看到密码
- 【一起学源码-微服务】Nexflix Eureka 源码八:EurekaClient注册表抓取 精妙设计分析!
前言 前情回顾 上一讲 我们通过单元测试 来梳理了EurekaClient是如何注册到server端,以及server端接收到请求是如何处理的,这里最重要的关注点是注册表的一个数据结构:Concurr ...
- 从头学pytorch(七):dropout防止过拟合
上一篇讲了防止过拟合的一种方式,权重衰减,也即在loss上加上一部分\(\frac{\lambda}{2n} \|\boldsymbol{w}\|^2\),从而使得w不至于过大,即不过分偏向某个特征. ...
- 从零开始のcocos2dx生活(八)ParticleSystemQuad
https://learnopengl-cn.github.io/01%20Getting%20started/04%20Hello%20Triangle/#_1 写的真的非常好-最近没时间拜读,只看 ...
- JVM探秘:垃圾收集算法
本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. 垃圾收集算法 垃圾收集算法主要有标记-清除算法.复制算法.标记-整理算法.分代收集算法 ...
- 你好,babel
写在前面 其实学babel是本人2019年Q3的一个计划,因为当时自己做的一个项目需要自己去配babel,也遇到了一些困难,发现自己对babel的了解还是很少的,所以决定好好看下babel:可是后来解 ...
- 「USACO15FEB」Censoring (Silver) 审查(银) 解题报告
题面 就是让你--在字符串A中,如果字符串B是A的子串,那么就删除在A中第一个出现的B,然后拼接在一起,一直重复上述步骤直到B不再是A的子串 |A|\(\le 10^6\) 思路: KMP+栈 1.由 ...
- 1023 组个最小数 (20 分)C语言
给定数字 0-9 各若干个.你可以以任意顺序排列这些数字,但必须全部使用.目标是使得最后得到的数尽可能小(注意 0 不能做首位).例如:给定两个 0,两个 1,三个 5,一个 8,我们得到的最小的数就 ...