首页 > 其他分享 >.NET Core 6.0 自定义异常处理中间件配置

.NET Core 6.0 自定义异常处理中间件配置

时间:2023-07-29 14:55:15浏览次数:36  
标签:Core exception 自定义 中间件 result context 异常 public

异常处理的几种方式:

1、通过异常过滤器捕获异常进行处理

2、自定义异常处理中间件,自定义异常处理中间件,中间件依托于请求管道运行,并且中间件的执行是有序的,与业务隔离开的,将中间件放置在请求管道开始能够捕获到全局异常。

 

配置异常处理中间件:

1、 编写自定义异常处理中间件,CustomExceptionHandleMiddleware.cs

 

using IPSP.Common;
using Microsoft.IdentityModel.Tokens;
using System.Net;
using System.Text.Json;

namespace IPSP.Middlewares
{
    public static class CutomExceptionHandleMiddlewareExtension
    {
        public static IApplicationBuilder UseCustomExceptionHandleMiddleware(this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<CustomExceptionHandleMiddleware>();
        }
    }
    public class CustomExceptionHandleMiddleware
    {
        private readonly RequestDelegate _next;
        private readonly IWebHostEnvironment _env;
        private readonly ILogger<CustomExceptionHandleMiddleware> _logger;

        public CustomExceptionHandleMiddleware(RequestDelegate next, IWebHostEnvironment env, ILogger<CustomExceptionHandleMiddleware> logger)
        {
            _next = next;
            _env = env;
            _logger = logger;
        }

        public async Task InvokeAsync(HttpContext context)
        {
            string message = string.Empty;
            HttpStatusCode code = HttpStatusCode.InternalServerError;

            ResposeResult result = new ResposeResult(code,message);

            try
            {
                await _next(context);
            }
            catch (SecurityTokenExpiredException exception)
            {
                _logger.LogError(exception,exception.Message);
                SetUnAuthorizeRespose(exception,ref result);
                await WriteToResposeAsync(context,result);
            }
            catch (UnauthorizedAccessException exception)
            {
                _logger.LogError(exception,exception.Message);

                SetUnAuthorizeRespose(exception,ref result);
                await WriteToResposeAsync(context,result);
            }
            catch (Exception exception)
            {
          //asp.net core 引入了 HttpContext.RequestAborted 来监听用户取消请求
                //由用户取消请求触发的异常
                if (context.RequestAborted.IsCancellationRequested && (exception is TaskCanceledException || exception is OperationCanceledException))
                {
                    _logger.LogInformation(exception, exception.Message);
                }
                else
                {
                    _logger.LogError(exception, exception.Message);
                }

                if (_env.IsDevelopment())
                {
                    var dic = new Dictionary<string, string>
                    {
                        ["Exception"] = exception.Message,
                        ["StackTrace"] = exception.StackTrace,
                    };
                    result.Message = JsonSerializer.Serialize(dic);
                }
                else
                {
                    result.Message = message;
                }
                await WriteToResposeAsync(context,result);
            }
        }

        public async Task WriteToResposeAsync(HttpContext context,ResposeResult result)
        {
            if (context.Response.HasStarted)
            {
                throw new InvalidOperationException("The response has already started, the http status code middleware will not be executed.");
            }

            string json = JsonSerializer.Serialize(result);
            context.Response.StatusCode = (int)result.Code;
            context.Response.ContentType = "application/json";
            await context.Response.WriteAsync(json);

        }


        public void SetUnAuthorizeRespose(Exception exception,ref ResposeResult result)
        {
            result.Code = HttpStatusCode.Unauthorized;

            if (_env.IsDevelopment())
            {
                var dic = new Dictionary<string, string>
                {
                    ["Exception"] = exception.Message,
                    ["StackTrace"] = exception.StackTrace
                };

                if (exception is SecurityTokenExpiredException tokenException)
                {
                    dic.Add("Expires",tokenException.Expires.ToString());
                    result.Message = JsonSerializer.Serialize(dic);
                }
            }
        }
    }
}

 

 

public class ResposeResult
    {
        public HttpStatusCode Code { get; set; }
        public string Message { get; set; }

        public ResposeResult(HttpStatusCode code, string message="")
        {
            Code = code;
            Message = message;
        }
    }

 

2、 在Program.cs文件将中间件放置在请求管道的开始处,这样才能捕获到全局的异常

var app = builder.Build();
//注意请将异常处理中间件放置在请求管道的开始处,这样才能捕获到全局的异常
//使用自定义异常处理中间件
app.UseCustomExceptionHandleMiddleware();

 

3、 测试捕捉异常,查看日志记录

[HttpGet]
        public async Task<IActionResult> UserLogin([FromQuery]LoginModel model)
        {
            User user = new User();
            user.Badge = model.Badge;
            user.Password = model.Password;

            int num = 0;
            int value = 10 / num;

            var result = await _userservice.Login(user.Badge,user.Password);
            if (result != null)
            {
                _logger.LogInformation($"{result.Badge}-{result.CName}在{DateTime.Now.ToString("yyyy-dd-MM HH:mm:ss")}登入了IPSP系统!");
            }
            return Ok(result);
        }

查看日志记录:

注意:异常处理中间件和异常过滤器都可以用来捕获程序的异常,只是捕获异常的范围不一样。IExceptionFilter 作为过滤器的一种,它只能捕获控制器内部的异常,如果我们的异常发生控制器之外就无法捕获了,将异常中间件放置在请求管道的第一个,可以捕获到全局的异常。

标签:Core,exception,自定义,中间件,result,context,异常,public
From: https://www.cnblogs.com/xjxue/p/17589787.html

相关文章

  • .netcore 中高性能队列Channel的应用与封装
          Channel存在于命名空间System.Threading.Channels中,是.net一种新型的线程安全集合,提供了发布和订阅消息处理功能,在一个服务中若接收消息和处理消息都很频繁,且处理消息耗时较长时,Channel是一种好的处理方式。1、创建Channel方式(支持泛型消息格式) 支持5种创建......
  • .NetCore中dump文件的创建和分析
    1、通过程序生成dump文件  安装nuget包:Microsoft.Diagnostics.NETCore.Client  生成dump文件代码:  varclient=newDiagnosticsClient(Environment.ProcessId);client.WriteDump(DumpType.Full,Path.Combine(AppDomain.CurrentDomain.BaseDirectory,"dumps","1.dump&quo......
  • asp.net core 2.0 web api基于JWT自定义策略授权
    原文通过登录,来获取Token,再在之后每次请求的Header中追加Authorization为Token的凭据,服务端验证通过即可能获取想要访问的资源。关于JWT的技术,可参考网络上文章,这里不作详细说明,这篇博文,主要说明在asp.netcore2.0中,基于jwt的webapi的权限设置,即在asp.netcore中怎么用JWT,再次......
  • docker aspnetcore学习笔记
    在终端窗口cmd:  示例应用程序对于示例应用程序,让我们使用.NET从模板创建一个简单的应用程序。在本地计算机中创建一个名为的目录。打开终端并切换到该目录。运行以下命令,使用ASP.NET核心Web应用模板创建C#应用。$mkdirdotnet-docker$cddotnet-docker$dotne......
  • .NET Core 6.0 log4Net 日志配置
    1、安装Microsoft.Extensions.Logging.Log4Net.AspNetCore包2、创建日志配置文件log4net.config,并设置文件属性为始终复制可以去官网下载配置文件,Apachelog4net–Apachelog4net:ConfigExample-Apachelog4net<?xmlversion="1.0"encoding="utf-8"?><log4net>......
  • ChatGPT 问答00004 html 自定义右键
    要在HTML页面中自定义右键菜单,可以使用JavaScript实现。下面是一个简单的例子:首先,在<head>标签中插入以下代码来禁用默认的浏览器右键菜单:<script>//禁用右键菜单document.addEventListener('contextmenu',function(event){event.preventDefault();});......
  • [回馈]ASP.NET Core MVC开发实战之商城系统(三)
    经过一段时间的准备,新的一期【ASP.NETCoreMVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】等功能的开发,今天继续讲解商品列表页面功能开发,仅供学习分享使用,如有不......
  • 通过 Javacore 诊断线程挂起等性能问题
    Javacore与WebSphereCommerce性能问题近年来,依据WebSphereCommerce(以下简称为WC)搭建的电子商务网站系统日益增多。由于系统本身的复杂性,一旦系统出现问题,尤其是性能问题,问题诊断和定位就会非常困难。下图所示为由WC系统为核心搭建的电子商务网站的一般逻辑架构,如图......
  • Asp.Net Core 集成JWT采用Rsa非对称密钥并实现自定义身份验证
    授权和鉴权分为了两个项目。首先是授权:建立Asp.netcore项目,并在Nuget包安装System.IdentityModel.Tokens.Jwt新建一个WebApi用于登录,这里使用账户密码方便调试。另外BaseResult是我封装的一个统一返回数据类型。需要注意的是audience以及JwtRegisteredClaimNames.Name......
  • .NET Core 验证码 - LazyCaptcha
    1.前言    在开发网站登录,安全验证等方面的时候,我们经常会使用到验证码,以前我们制作验证码的时候,一般都会写大量的代码完成验证码的制作。有没有现成,又好用的验证码工具插件呢?当然是有的,这里就介绍一个开源又好用的验证码工具LazyCaptcha。2.LazyCaptcha介绍   ......