Asp.Netcore使用Filter来实现接口的全局异常拦截,以及前置拦截和后置拦截
原文链接:https://blog.csdn.net/qq_38762313/article/details/85234594
全局异常拦截器:
解决写每个接口都需要去做容错而添加try{}catch{},有了该异常拦截器后,所有接口都不需要去添加异常处理。
实现方式:
第一步:新建一个类继承 IExceptionFilter,添加 using Microsoft.AspNetCore.Mvc.Filters;该类的名称命名要求是:后缀必须ExceptionFilter,例如:GlobalExceptionFilter。该类必须实现OnException 这个方法。这个方法是当异常发生时会进入。 例如下面的例子:
public class ExceptionFilter : IExceptionFilter
{
/// <summary>
/// 发生异常时进入
/// </summary>
/// <param name="context"></param>
public void OnException(ExceptionContext context)
{
if (context.ExceptionHandled == false)
{
context.Result = new ContentResult
{
Content = context.Exception.Message,//这里是把异常抛出。也可以不抛出。
StatusCode = StatusCodes.Status200OK,
ContentType = "text/html;charset=utf-8"
};
}
context.ExceptionHandled = true;
}
/// <summary>
/// 异步发生异常时进入
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public Task OnExceptionAsync(ExceptionContext context)
{
OnException(context);
return Task.CompletedTask;
}
}
第二步:修改Stup.cs文件如下即完成。
.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1) 把这段代码修改为:
.AddMvc(options =>
{
options.Filters.Add<GlobalExceptionFilter>();
})
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
前置和后置拦截器:
解决接口入参数的合法性验证问题,以及对参数等前期的信息处理等。例如:访问的合法性等。
实现方式:
第一步:异常拦截器很相似,新建一个类继承 IActionFilter,添加 using Microsoft.AspNetCore.Mvc.Filters;该类的名称命名要求是:后缀必须ActionFilter,例如:GlobalActionFilter。该类必须实现OnActionExecuted和OnActionExecuting这两个方法。这个方法是当异常发生时会进入。 例如下面的例子:
public class GlobalActionFilter : IActionFilter
{
/// <summary>
/// Action 执行后拦截
/// </summary>
/// <param name="context"></param>
public void OnActionExecuted(ActionExecutedContext context)
{
}
/// <summary>
/// Action 执行前拦截[模型验证应该在此处先处理]
/// </summary>
/// <param name="context"></param>
public void OnActionExecuting(ActionExecutingContext context)
{
context.HttpContext.Response.Headers["Access-Control-Allow-Origin"] = "*";//解决拦截器添加后跨域不生效的问题
if (!context.ModelState.IsValid)//验证参数的合法性问题。返回错误信息
{
///模型有效性验证失败处理逻辑...比如将提示信息返回
StringBuilder stringBuilder = new StringBuilder();
///模型有效性验证失败处理逻辑.....
///如返回错误信息,这里可自动包装
foreach (var item in context.ModelState.Values)
{
foreach (var error in item.Errors)
{
stringBuilder.Append($"{ error.ErrorMessage}|");
}
}
context.Result = new ContentResult
{
Content = stringBuilder.ToString(),
StatusCode = StatusCodes.Status200OK,
ContentType = "text/html;charset=utf-8"
};
}
}
}
第二步:修改Stup.cs文件如下即完成。
.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1) 把这段代码修改为:
.AddMvc(options =>
{
options.Filters.Add<GlobalActionFilter>();
})
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
模型和参数验证的使用方式[配合前置拦截器,开发人员可以不用操心验证和返回错误信息]:
在参数前面添加特性,常用的三个特性如下
接收Query的写法
[HttpGet("test")]
public object test([FromQuery] [Required(ErrorMessage = "名称不能为空")][MaxLength(5,ErrorMessage = "名称长度不能大于5")][MinLength(3,ErrorMessage = "名称最小长度为3")] string name)
{
}
一个参数可以同时写多个特性进行验证。
接收Body的写法
该特性验证要在实体类上写,接参时用实体类去接,这样验证通用起到效果。
例如:
[HttpPost("test")]
public object test([FromBody] Users user)
{
}
public class Users
{
[Required(ErrorMessage = "名称不能为空")]
public string Name{get;set;};
public int Age{get;set;};
}
Asp.Netcore使用Filter来实现接口的全局异常拦截,以及前置拦截和后置拦截的更多相关文章
- Asp.netCore 的Startup 不继承接口
有一个问题: Asp.netCore 的Startup 要实现 Config 和ConfigServie 方法, 为什么不接口约束呢. 进入源码: // // 摘要: // /// Specify t ...
- 在 ASP.NET Web API 中使用 Attribute 统一处理异常
并非所有的异常都需要 try-catch 进行重复的处理,这会导致大量的重复性代码,一旦后续系统出现异常处理机制的修改,随着代码量增多,修改也会变的更加困难. ASP.NET Web API 中特别增 ...
- ASP.NETCORE MVC模块化
ASP.NETCORE MVC模块化编程 前言 记得上一篇博客中跟大家分享的是基于ASP.NETMVC5,实际也就是基于NETFRAMEWORK平台实现的这么一个轻量级插件式框架.那么今天我主要分享的 ...
- Asp.NetCore源码学习[2-1]:配置[Configuration]
Asp.NetCore源码学习[2-1]:配置[Configuration] 在Asp. NetCore中,配置系统支持不同的配置源(文件.环境变量等),虽然有多种的配置源,但是最终提供给系统使用的只 ...
- Asp.NetCore源码学习[2-1]:日志
Asp.NetCore源码学习[2-1]:日志 在一个系统中,日志是不可或缺的部分.对于.net而言有许多成熟的日志框架,包括Log4Net.NLog.Serilog 等等.你可以在系统中直接使用这些 ...
- Asp.Net MVC Filter 实现方式和作用范围控制
MVC中的Filte 简单又优雅的实现了AOP ,在日志,权限,缓存和异常处理等方面用的比较多.但本文不是讨论Filter这些功能点,而是总结Filter实现的方式.说实现也不太准确,也就是它的呈现方 ...
- Asp.NetCore之组件写法
本章内容和大家分享的是Asp.NetCore组件写法,在netcore中很多东西都以提供组件的方式来使用,比如MVC架构,Session,Cache,数据库引用等: 这里我也通过调用验证码接口来自定义 ...
- asp.netcore 深入了解配置文件加载过程
前言 配置文件中程序运行中,担当着不可或缺的角色:通常情况下,使用 visual studio 进行创建项目过程中,项目配置文件会自动生成在项目根目录下,如 appsettings.json, ...
- Asp.NetCore依赖注入和管道方式的异常处理及日志记录
前言 在业务系统,异常处理是所有开发人员必须面对的问题,在一定程度上,异常处理的能力反映出开发者对业务的驾驭水平:本章将着重介绍如何在 WebApi 程序中对异常进行捕获,然后利用 Nlog ...
随机推荐
- psexec远程重启服务器
1 使受控机器支持远程psexec 管理 暂参照其他教程 2 打开远程命令行 3 重启服务执行net命令 停止远程桌面 net stop termservice 启动远程桌面 net start te ...
- P4206[NOI2005]聪聪与可可
链接P4206 [NOI2005]聪聪与可可 类似于开车旅行,如果老鼠确定了那么猫的路线是确定的. 预处理\(g_{i,j}\)表示老鼠在\(i\)号点,猫的下一步方向,\(Bfs\)就行了 设\(f ...
- bzoj4408 [Fjoi 2016]神秘数 & bzoj4299 Codechef FRBSUM 主席树+二分+贪心
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4299 https://lydsy.com/JudgeOnline/problem.php?id ...
- 免插件,简单实现上拉加载loading
上拉加载是前端经常遇到的问题,采用插件往往能够轻松解决,这里介绍一种免插件简单实现上拉加载的方法,参考一下,下面分享一下代码. html <body> <ul> <li& ...
- 5.Docker存储卷
一.概述 1.Docker底层存储机制 Docker镜像由多个只读层叠加而成,启动容器时,Docker会加载只读镜像层并在镜像栈顶部添加一个读写层. 如果运行中的容器修改了现有的一个已经存在的文件,那 ...
- Element ui 上传文件组件(单文件上传) 点击提交 没反应
element ui 第一次上传文件后 上传其他文件再次点击不再次提交 需要使用 clearFiles 清空已上传文件列表 这时候在次点击 上传按钮 就会惊喜的发现 可以上传了使用方法 this.$r ...
- 左右flex布局
修复版本
- No Spring Session store is configured: set the 'spring.session.store-type'
发现session store type使用来存放session的存储方式,目前Spring boot中只支持Redis方式. 由于本应用暂无需将session放入redis的需求,故这里就可以将se ...
- D0g3_Trash_Pwn_Writeup
Trash Pwn 下载文件 1 首先使用checksec查看有什么保护 可以发现,有canary保护(Stack),堆栈不可执行(NX),地址随机化没有开启(PIE) 2 使用IDA打开看看 mai ...
- 批处理bat文件显示中文乱码解决方式
1.下载Notepad++并安装 2.选择编码,将文件编码转换为ANSI编码