Asp.net Core 异常日志与API返回值处理
需求:
1、对异常进行捕获记录日志 并且修改返回值给前端
解释:
ILogger4是自定义的一个日志,更改它就好
解决方案1:
使用中间件进行异常捕获并且修改其返回值
public class ErrorMiddleware
{
private readonly RequestDelegate _next;
ILogger4<ErrorMiddleware> logger4;
public ErrorMiddleware(RequestDelegate next,ILogger4<ErrorMiddleware> logger4)
{
_next = next;
this.logger4 = logger4;
} public async Task Invoke(HttpContext httpContext)
{
try
{
await _next(httpContext);
}
catch (Exception e)
{
logger4.LogError(e,e.Message+"\r\n"+e.StackTrace);
throw e;
} }
}
这一步简单,从源码里 ExceptionHandlerMiddleware.cs类里 Copy的代码
使用中间件进行修改返回值
public class ResultMiddleware
{
private readonly RequestDelegate _next; public ResultMiddleware(RequestDelegate next)
{
_next = next;
} public async Task Invoke(HttpContext httpContext)
{ await _next(httpContext);
string bodyString = "<p>不好意思 系统正在升级维护 请稍后再试</p>";
var by = Encoding.UTF8.GetBytes(bodyString);
var heard =(Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpResponseHeaders)httpContext.Response.Headers;
heard.HeaderContentLength = by.Length.ToString();
//必须要手动设置请求头的ContentLength大小 才能修改返回值的数据
await httpContext.Response.Body.WriteAsync(by);
}
}
这是从网上copy 修改的代码,不推荐使用 开销太大 转为过滤器
解决方案2:
使用中间件进行异常捕获并且修改其返回值
异常过滤器
/// <summary>
/// 异常过滤器
/// </summary>
public class ErrorFilter :Attribute,IExceptionFilter
{ ILogger4<ErrorFilter> logger4;
/// <summary>
/// 标签
/// </summary>
public ErrorFilter() {
} /// <summary>
/// 全局配置
/// </summary>
/// <param name="logger4"></param>
public ErrorFilter(ILogger4<ErrorFilter> logger4) {
this.logger4 = logger4;
} public void OnException(ExceptionContext context)
{
var e = context.Exception;
logger4.LogError(e, e.Message + "\r\n" + e.StackTrace);
context.Result = new JsonResult(new BaseResult(e.Message));
}
}
方法过滤器
/// <summary>
/// 对打上该标记的 返回结果为JsonResult的请求进行Result包装
/// </summary>
public class ApiResultFilter : Attribute, IActionFilter
{
/// <summary>
/// 执行方法体之后
/// </summary>
/// <param name="context"></param>
public void OnActionExecuted(ActionExecutedContext context)
{ var result = context.Result;
if (result!=null &&result is JsonResult resulta)
{
context.Result = new JsonResult(new BaseResult(resulta.Value));
} } /// <summary>
/// 执行方法体之前
/// </summary>
/// <param name="context"></param>
public void OnActionExecuting(ActionExecutingContext context)
{
//不做修改
}
}
可以使用标签的方法
/// <summary>
/// 测试 返回过滤器
/// </summary>
/// <returns></returns>
[ErrorFilter]
[ApiResultFilter]
[HttpGet]
public IActionResult TestReuslt()
{
throw new Exception("AA");
var obj = new
{
A = ""
};
return Json(obj);
}
也可以使用全局配置的方法
//注册过滤器
services.AddSingleton<ApiResultFilter>();
services.AddSingleton<ErrorFilter>(); services.AddMvc(
config => {
config.Filters.AddService(typeof(ApiResultFilter));
config.Filters.AddService(typeof(ErrorFilter));
})
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
注意:
打上的标签无法获取IOC容器
不要使用全局配置与标签一起使用 会造成多次调用
在这里推荐使用过滤器而不是中间件,
贴上一张大佬的过滤器调用图

结果:

Asp.net Core 异常日志与API返回值处理的更多相关文章
- ASP.NET Core中的Action的返回值类型
在Asp.net Core之前所有的Action返回值都是ActionResult,Json(),File()等方法返回的都是ActionResult的子类.并且Core把MVC跟WebApi合并之后 ...
- 从头编写 asp.net core 2.0 web api 基础框架 (3)
第一部分:http://www.cnblogs.com/cgzl/p/7637250.html 第二部分:http://www.cnblogs.com/cgzl/p/7640077.html 之前我介 ...
- 【转载】从头编写 asp.net core 2.0 web api 基础框架 (3)
Github源码地址:https://github.com/solenovex/Building-asp.net-core-2-web-api-starter-template-from-scratc ...
- 从头编写 asp.net core 2.0 web api 基础框架 (1)
工具: 1.Visual Studio 2017 V15.3.5+ 2.Postman (Chrome的App) 3.Chrome (最好是) 关于.net core或者.net core 2.0的相 ...
- 【转载】从头编写 asp.net core 2.0 web api 基础框架 (1)
工具: 1.Visual Studio 2017 V15.3.5+ 2.Postman (Chrome的App) 3.Chrome (最好是) 关于.net core或者.net core 2.0的相 ...
- 使用 ASP.NET Core MVC 创建 Web API(四)
使用 ASP.NET Core MVC 创建 Web API 使用 ASP.NET Core MVC 创建 Web API(一) 使用 ASP.NET Core MVC 创建 Web API(二) 使 ...
- 从零开始学习 asp.net core 2.1 web api 后端api基础框架(二)-创建项目
原文:从零开始学习 asp.net core 2.1 web api 后端api基础框架(二)-创建项目 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.ne ...
- 【ASP.NET Core学习】Web API
这里介绍在ASP.NET Core中使用Web API创建 RESTful 服务,本文使用VSCode + NET Core3.0 创建简单Rest API 格式化输出 JSON Patch请求 Op ...
- 如何利用Serilog的RequestLogging来精简ASP.NET Core的日志输出
这是该系列的第一篇文章:在ASP.NET Core 3.0中使用Serilog.AspNetCore. 第1部分-使用Serilog RequestLogging来简化ASP.NET Core的日志输 ...
随机推荐
- 深度剖析Javascript执行环境、作用域链
一.执行环境 执行环境(也叫做执行上下文,Execution Context)是Javascript中最为重要的一个概念.执行环境定义了变量或函数有权访问其他数据,决定了它们各自的行为.每个执行环境都 ...
- Opencv的线性滤波和非线性滤波
线性滤波 :方框滤波 均值滤波 高斯滤波 非线性滤波: 中值滤波 双边滤波 这几个滤波都是起模糊作用 去除噪点 不废话了 下面是代码 #include <opencv2/opencv.h ...
- 如何编译和使用自定义Qt动态链接库 | how to build and use user-defined qt library
本文首发于个人博客https://kezunlin.me/post/cf628dd8/,欢迎阅读! guide to build qt library and use in another proje ...
- MySQL索引长度限制
索引 TextField是不支持建立索引的 MySQL对索引字段长度有限制 innodb引擎的每个索引列长度限制为767字节(bytes),所有组成索引列的长度和不能大于3072字节 myisam引擎 ...
- 扛把子组作业要求 20191024-3 互评Alpha阶段作品
此作业的要求参见[https://edu.cnblogs.com/campus/nenu/2019fall/homework/9860] 组名:扛把子 组长:迟俊文 组员:宋晓丽 梁梦瑶 韩昊 刘信鹏 ...
- 工作常用4种Java线程锁的特点,性能比较、使用场景
多线程的缘由 在出现了进程之后,操作系统的性能得到了大大的提升.虽然进程的出现解决了操作系统的并发问题,但是人们仍然不满足,人们逐渐对实时性有了要求. 使用多线程的理由之一是和进程相比,它是一种非常花 ...
- 选择了uniapp开发app
7月份打算做一简单app,之前公司做app的时候简单用过Dcloud公司的mui,当时由于uniapp刚出来,最终选择了mui.对uniapp的 了解几乎没有. 做app对我来说几乎是零基础的,当然是 ...
- python 面向对象的基本概念(未完待续)
面向对象编程简称OOP(Object-oriented-programming),是一种程序设计思想. 面向过程编程(如C语言)指一件事该怎么做,面向对象编程(如Java.python)指一件事该让谁 ...
- Dubbo面试八连问,这些你都能答上来吗?
Dubbo是什么? Dubbo能做什么? Dubbo内置了哪几种服务容器? Dubbo 核心的配置有哪些? Dubbo有哪几种集群容错方案,默认是哪种? Dubbo有哪几种负载均衡策略,默认是哪种? ...
- 附012.Kubeadm部署高可用Kubernetes
一 kubeadm介绍 1.1 概述 参考<附003.Kubeadm部署Kubernetes>. 1.2 kubeadm功能 参考<附003.Kubeadm部署Kubernetes& ...