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;};
}

原文地址:https://www.cnblogs.com/frank0812/p/11725580.html

时间: 2024-09-30 06:26:34

Asp.Netcore使用Filter来实现接口的全局异常拦截,以及前置拦截和后置拦截的相关文章

Asp.NetCore程序发布到CentOs(含安装部署netcore)--最佳实践(二)

原文:Asp.NetCore程序发布到CentOs(含安装部署netcore)--最佳实践(二) Asp.NetCore程序发布到CentOs(含安装部署netcore)--最佳实践(一) 接上一篇 3. Nginx配置反向代理 3.1 cnetos 安装nginx 首先,我们需要在服务器上安装Nginx.参考网址 3.1.1:添加Nginx存储库 要添加CentOS 7 EPEL仓库,请打开终端并使用以下命令: sudo yum install epel-release EPEL的全称叫 Ex

ASP.NETCore学习记录(一)

ASP.NETCore学习记录(一) asp.net core介绍  Startup.cs  ConfigureServices  Configure 0. ASP.NETCore 介绍 ASP.NETCore是一个新的开源和跨平台的框架,用于构建如Web应用.物联网(IoT)应用和移动后端应用等连接到互联网的基于云的现代应用程序.ASP.NET Core应用可运行于.NET Core和完整的.NET Framework之上.构建它的目的是为那些部署在云端或者内部运行的应用提 供一个优化的开发框

Asp.NetCore依赖注入和管道方式的异常处理及日志记录

原文:Asp.NetCore依赖注入和管道方式的异常处理及日志记录 前言 ????在业务系统,异常处理是所有开发人员必须面对的问题,在一定程度上,异常处理的能力反映出开发者对业务的驾驭水平:本章将着重介绍如何在 WebApi 程序中对异常进行捕获,然后利用 Nlog 组件进行记录:同时,还将介绍两种不同的 异常捕获方式:管道捕获/服务过滤:通过本练习,将学习到如何捕获异常.处理异常跳转.记录异常信息. 1. 搭建框架 ????首先,创建一个 WebApi 项目,选择 Asp.Net Core W

ASP.NETCore 3.0 Autofac替换及控制器属性注入及全局容器使用

1.Autofac基础使用 参考: https://www.cnblogs.com/li150dan/p/10071079.html 2.ASP.NETCore 3.0 Autofac 容器替换 需要引用:Autofac, Autofac.Extensions.DependencyInjection 在Program.cs 使用AutofacServiceProviderFactory进行容器替换. public static IHostBuilder CreateHostBuilder(str

从桌面到 Web - 二十几天学 ASP.NETCore 1

这么多年一直从事桌面开发,一直没有时间好好学学  web 开发.感觉自己就像从石器时代走来的古代类人猿.由于工作的调整,现在终于有时间学习一下 Web 开发.出于对技术和框架的熟悉和继承,决定还是学习微软的 Web 开发框架(虽然我一直认为java 是一种比C# 更优秀的语言,社区的活力远高于 C#,想想 eclipse 还是算了吧). 微软的 Web 开发框架从 ASP,ASP.NET,ASP.NET MVC 一直到现在的 ASP.NET Core一路走来,坏消息是没有一个熟悉的,好消息是 A

Asp.Net MVC -Filter

Filter(筛选器)是基于AOP(面向切面编程)的设计,它的作用是对MVC框架处理客户端请求注入额外的逻辑,以非常简单优美的方式实现横切关注点(Cross-cutting Concerns).横切关注点是指横越应该程序的多个甚至所有模块的功能,经典的横切关注点有日志记录.缓存处理.异常处理和权限验证等.本文将分别介绍MVC框架所支持的不同种类的Filter的创建和使用,以及如何控制它们的执行. 四种基本 Filter 概述 MVC框架支持的Filter可以归为四类,每一类都可以对处理请求的不同

为ASP.NetCore程序启用SSL

紧接着上一篇搭建连接MySql的三层架构的ASP.NetCore2.0的WebApi的案例,这篇来实现为ASP.NetCore启用SSL支持 由于ASP.NetCore默认服务器Kestrel不像iis Express那样会自动生成本地证书,所以就需要手动构建pfx证书. 生成pfx证书 开发环境证书就用iis默认的本地证书即可,Cortana搜索:IIS,出现以下结果点击 进入管理器:点击服务器证书选项 选中以下本地默认证书后右键导出,指定路径和密码点击确认. 修改Program中BuildW

C#/ASP.NET MVC微信公众号接口开发之从零开发(三)回复消息 (附源码)

C#/ASP.NET MVC微信接口开发文章目录: 1.C#/ASP.NET MVC微信公众号接口开发之从零开发(一) 接入微信公众平台 2.C#/ASP.NET MVC微信公众号接口开发之从零开发(二) 接收微信消息并且解析XML(附源码) 一.拼凑回复的XML字符串 微信被动回复的形式有一下六种: 1 回复文本消息 2 回复图片消息 3 回复语音消息 4 回复视频消息 5 回复音乐消息 6 回复图文消息 分别对应不同的XML形式,这里以文本消息和图文为例,读者举一反三其他的类似,不再赘述:

利用ASP.NET MVC Filter 处理网站异常

1,Filter(筛选器)是基于AOP(面向方面编程)的设计,他的好处什么的就不是本文要说的,如果要了解关于filter的相关知识请参照,大神说的够清楚了:http://www.cnblogs.com/willick/p/3331520.html 这里主要记录一下我自己的利用ASP.NET MVC Filter 处理网站异常过程: 2,首先添加 一个自定义的filter类: using System; using System.Collections.Generic; using System.