ASP.NET Core 中间件的使用(三):全局异常处理机制(Filter拦截器对比)

简介: ASP.NET Core 中间件的使用(三):全局异常处理机制(Filter拦截器对比)

前言

只是Filter拦截器的对比,还不是中间件,注意甄别

我们经常听到“秒修复秒上线”,觉得很厉害的样子。

其实不然,这只是一个调侃而已,出现问题的方式很多(逻辑漏洞、代码异常、操作方式不正确等)。

我们今天来说代码异常问题怎么快速定位,减少不必要的时间浪费。

这就是今天的主题“添加全局异常处理机制”捕捉异常存储到数据库(mongodb、SqlServer、MySQL等)。

PS:输出txt的话不怎么友好,不是所有人都能登录服务器的。

异常是一种运行时错误,当异常没有得到适当的处理,很可能会导致你的程序意外终止。

创建项目

我们创建一个ASP.NET Core Web API项目,选择.NET Core3.1。

 

创建全局异常过滤器

在控制器里面创建一个异常过滤器,命名为ExceptionFilter.cs,过滤器继承IExceptionFilter接口。

注意,我这里入库用的是efcore+sqlserver,大家可以根据自己实际情况使用ORM和数据库方式。

 

异常过滤器,顾名思义,就是当程序发生异常时所使用的过滤器。用于在系统出现未捕获异常时的处理。

实现一个自定义异常过滤器,自定义一个全局异常过滤器需要实现IExceptionFilter接口

 

IExceptionFilter接口会要求实现OnException方法,当系统发生未捕获异常时就会触发这个方法。

OnException方法有一个ExceptionContext异常上下文,其中包含了具体的异常信息,HttpContext及mvc路由信息。

系统一旦出现未捕获异常后,比较常见的做法就是使用日志工具,将异常的详细信息记录下来,方便修正调试。

下面是日志记录的实现。

using Microsoft.AspNetCore.Mvc.Filters;
using System;
namespace Log4NetWebAPI.Controllers
{
    public class ExceptionFilter: IExceptionFilter
    {
        //全局异常处理机制
        public void OnException(ExceptionContext context)
        {
            Exception ex = context.Exception;
            //错误所在的控制器方法名称
            var DisplayName = context.ActionDescriptor.DisplayName;
            #region 错误所在的行号行号
            ////行号前的名称有的是中文,有的是英文,注意甄别
            //var aaa = ex.StackTrace.Substring(ex.StackTrace.IndexOf("行号"), ex.StackTrace.Length - ex.StackTrace.IndexOf("行号"));
            //var ccc = ex.StackTrace.Substring(ex.StackTrace.IndexOf("line"), ex.StackTrace.Length - ex.StackTrace.IndexOf("line"));
            var lineNumber = 0;
            const string lineSearch = ":line ";
            var index = ex.StackTrace.LastIndexOf(lineSearch);
            if (index != -1)
            {
                var lineNumberText = ex.StackTrace.Substring(index + lineSearch.Length);
                var lineNumberStr = lineNumberText.Substring(0, lineNumberText.IndexOf("\r\n"));
                if (int.TryParse(lineNumberStr, out lineNumber))
                {
                }
            }
            #endregion
            #region 写入信息到【数据库】,这里自行入库即可(mongodb、SqlServer、MySQL等),我以SqlServer为例
            errorLog md = new errorLog();
            md.logTime = DateTime.Now;
            md.logType = "error";
            md.displayName = DisplayName;  //错误位置
            md.lineNumber = lineNumber;  //错误行号
            md.message = ex.Message;    //错误信息
            md.messagedetails = ex.ToString();  //错误详情
            md.createTime= DateTime.Now;
            using (var ctx = new dbContext())
            {
                ctx.Add(md);
                ctx.SaveChanges();
            }
            #endregion
            //下面是你的返回页面显示的内容提示,以下省略
        }
    }
}

依赖注入全局异常处理机制

Startup.cs里面把我们刚刚创建的全局异常处理机制注入,放到ConfigureServices方法里面。

//添加全局异常处理机制
services.AddMvc(option => {
  option.Filters.Add<ExceptionFilter>();
});

 // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
            //添加全局异常处理机制
            services.AddMvc(option => {
                option.Filters.Add<ExceptionFilter>();
            });
        }

测试全局异常处理机制

“将string字符串转换为int类型,如下代码,肯定是报错的,我们来捕捉一下错误信息入库。

var numberNo = "我是序列号";

//这里是转换为int类型,然后数据源是string,肯定报错,然后我们全局捕捉

//注意,我们这里没有写try catch

var number = Convert.ToInt32(numberNo);

运行项目后我们查询一下数据库,发现捕捉到错误信息了,包括

错误时间:2021-09-28 15:12:58.307

日志类型:error

错误的方法位置:Log4NetWebAPI.Controllers.WeatherForecastController.Get (Log4NetWebAPI),

错误的行号:36行,

错误的信息:Input string was not in a correct format.(输入字符串的格式不正确。)

下面是控制器方法截图


推荐资料

参考文献

相关文章
|
8月前
|
开发框架 .NET C#
ASP.NET Core Blazor 路由配置和导航
大家好,我是码农刚子。本文系统介绍Blazor单页应用的路由机制,涵盖基础配置、路由参数、编程式导航及高级功能。通过@page指令定义路由,支持参数约束、可选参数与通配符捕获,结合NavigationManager实现页面跳转与参数传递,并演示用户管理、产品展示等典型场景,全面掌握Blazor路由从入门到实战的完整方案。
638 6
|
开发框架 .NET 开发者
简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
Scrutor 是一个简化 ASP.NET Core 应用程序中依赖注入(DI)注册过程的开源库,支持自动扫描和注册服务。通过简单的配置,开发者可以轻松地从指定程序集中筛选、注册服务,并设置其生命周期,同时支持服务装饰等高级功能。适用于大型项目,提高代码的可维护性和简洁性。仓库地址:&lt;https://github.com/khellang/Scrutor&gt;
715 5
|
开发框架 算法 中间件
ASP.NET Core 中的速率限制中间件
在ASP.NET Core中,速率限制中间件用于控制客户端请求速率,防止服务器过载并提高安全性。通过`AddRateLimiter`注册服务,并配置不同策略如固定窗口、滑动窗口、令牌桶和并发限制。这些策略可在全局、控制器或动作级别应用,支持自定义响应处理。使用中间件`UseRateLimiter`启用限流功能,并可通过属性禁用特定控制器或动作的限流。这有助于有效保护API免受滥用和过载。 欢迎关注我的公众号:Net分享 (239字符)
441 1
|
开发框架 缓存 .NET
GraphQL 与 ASP.NET Core 集成:从入门到精通
本文详细介绍了如何在ASP.NET Core中集成GraphQL,包括安装必要的NuGet包、创建GraphQL Schema、配置GraphQL服务等步骤。同时,文章还探讨了常见问题及其解决方法,如处理复杂查询、错误处理、性能优化和实现认证授权等,旨在帮助开发者构建灵活且高效的API。
497 3
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
865 0
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
713 5
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
441 7
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
371 0
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
369 0
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?
517 0