首页 > 编程语言 >ASP.NET Core 全局异常处理

ASP.NET Core 全局异常处理

时间:2023-06-04 18:00:32浏览次数:75  
标签:Core ASP Response 中间件 public context NET 异常 logger

IAsyncExceptionFilter

在 ASP.NET Core 中,可以使用异常过滤器(Exception Filter)来捕获和处理应用程序中的异常。IExceptionFilter 接口和 IAsyncExceptionFilter 接口都可以用来实现自定义的异常过滤器。不过我更建议您考虑它的异步版本:IAsyncExceptionFilter。

public class CustomExceptionFilter : IAsyncExceptionFilter
{
    private readonly ILogger<CustomExceptionFilter> _logger;

    public CustomExceptionFilter(ILogger<CustomExceptionFilter> logger)
    {
        _logger = logger;
    }

    public async Task OnExceptionAsync(ExceptionContext context)
    {
        _logger.LogError(context.Exception, "An error occurred.");

        if (!context.ExceptionHandled)
        {
            context.Result = new ViewResult { ViewName = "Error" };
            context.ExceptionHandled = true;
        }

        await Task.CompletedTask;
    }
}

在这个示例中,我们创建了一个名为 CustomExceptionFilter 的自定义异常过滤器,它实现了 IAsyncExceptionFilter 接口。在 OnExceptionAsync 方法中,我们记录了异常并返回一个 ViewResult 对象来显示用户友好的错误信息。

要使用这个过滤器,只需要在 Startup.ConfigureServices 方法中注册它:

services.AddMvc(options =>
{
    options.Filters.Add<CustomExceptionFilter>();
});

中间件处理异常

新建一个中间件在管道中实现全局异常捕获。

public class MyExceptionMiddleware
{
	private readonly RequestDelegate _next;
	private readonly ILogger<MyExceptionMiddleware> _logger;

	public MyExceptionMiddleware(RequestDelegate next, ILogger<MyExceptionMiddleware> logger)
	{
		_next = next;
		_logger = logger;
	}

	public async Task Invoke(HttpContext context)
	{
		try
		{
			await _next(context);
		}
		catch (Exception ex)
		{
			_logger.LogError($"An exception occurred: {ex}");

			context.Response.ContentType = "application/json";
			context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;

			var jsonResponse = System.Text.Json.JsonSerializer.Serialize(new { error = ex.Message });
			await context.Response.WriteAsync(jsonResponse);
		}
	}
}

然后在 Startup.cs 中,注册管道:

app.UseMiddleware<MyExceptionMiddleware>();

默认的AspNet Core异常处理

if (env.IsDevelopment())
{
	// dev环境,一旦报错就会跳转到错误堆栈页面
	app.UseDeveloperExceptionPage();
	app.UseSwagger();
	app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "DaXiong.Demo.WebApi v1"));
}
else
{
	// 非dev环境输出格式,个人根据实际情况扩展
	app.UseExceptionHandler(errorApp =>
	{
		errorApp.Run(async context =>
		{
			Console.WriteLine();
			// 处理异常并生成响应
			var exception = context.Features.Get<IExceptionHandlerPathFeature>().Error;
			var statusCode = (int)HttpStatusCode.InternalServerError;
			var message = "An error occurred while processing your request.";

			// 根据异常类型决定如何响应请求...

			// 生成响应
			context.Response.StatusCode = statusCode;
			context.Response.ContentType = "application/json";
			await context.Response.WriteAsync(JsonConvert.SerializeObject(new
			{
				statusCode,
				message
			}));
		});
	});
}

注意中间件的运行顺序

image
后添加的中间件返回数据会覆盖,前面的
image

一般情况使用默认的错误处理中间件也够了

image

有了异常中间件还需要异常过滤器(IExceptionFilter )吗

IExceptionFilter 作为MVC中间件之间的内容,它需要MVC在发现错误之后将错误信息提交给它处理,因此它的错误处理范围仅限于MVC中间件。所以,假如我们需要捕获MVC中间件之前的一些错误,其实是捕获不到的。 而对于ExceptionHandlerMiddleware中间件来说就很简单了,它作为第一个中间件,凡是在它之后的所有错误它都能够捕获得到。
但是,如果你想要在一个控制器或动作方法上执行特定的异常处理逻辑,仍然可以使用 IAsyncExceptionFilter。通过使用该接口,你可以在控制器或动作方法级别组织、记录和响应异常。在这种情况下,控制器或动作方法将优先于全局的 UseExceptionHandler 中间件。

标签:Core,ASP,Response,中间件,public,context,NET,异常,logger
From: https://www.cnblogs.com/lgxlsm/p/17456015.html

相关文章

  • 基于Admin.NET框架的前端的一些改进和代码生成处理(2)
    在上篇随笔《基于Admin.NET框架的前端的一些改进和代码生成处理(1)》中大致介绍了一些关于对Admin.NET框架的前端的改造工作,主要目的就是希望能够增加前端代码的简洁性和可读性,以及利用代码生成工具来快速生成相关的代码,从而减少开发过程中的繁琐问题。本篇随笔继续探讨一下,对其中一......
  • 基于Admin.NET框架的前端的一些改进和代码生成处理(1)
    Admin.NET是一套基于Furion/.NET6实现的通用管理平台,模块插件式开发,框架包含了常规的权限管理、字典等管理模块,以及一些Vue3的Demo案例,框架前后端分离。后端基于基于Furion/.NET6实现,底层集成SqlSugar;前端则是采用Vue-Next-Admin的前端框架,整体是一套非常不错的框架。本人比较喜......
  • ubuntu上产生coredump
    之前按书里的教程老是整不出coredump,都快把我整郁闷了。在千辛万苦之下才找到一篇博客适用于这种情况。记录一下。 一般情况下:设置coredump文件的最大值:输入命令:$ulimit-cunlimited 在/proc/sys/kernel/core_pattern中设置格式化的core文件保存位置或者文件名在相对路......
  • 02_容器编排技术 Kubernetes
    云原生容器编排技术Kubernetes面试题1、简述etcd及其特点?etcd是CoreOS团队发起的开源项目,是一个管理配置信息和服务发现(servicediscovery)的项目,它的目标是构建一个高可用的分布式键值(key-value)数据库,基于Go语言实现。特点:简单:支持REST风格的HTTP+JSONAPI安全:支持......
  • .net 温故知新【11】:Asp.Net Core WebAPI 入门使用及介绍
    在Asp.NetCore上面由于现在前后端分离已经是趋势,所以asp.netcoreMVC用的没有那么多,主要以WebApi作为学习目标。一、创建一个WebApi项目我使用的是VS2022,.Net7版本。在创建界面有几项配置:配置Https启用Docker使用控制器启用OpenAPI支持不使用顶级语句其中配置Ht......
  • NetHunter使用Rucky实现HID键盘数据模拟攻击
    知识概要:NetHunter:是KaliLinux推出的移动Android端的系统Rucky:是一种基于HID设备的攻击工具,其本质是一个可编程的键盘模拟器,可以用于快速执行各种攻击,例如在目标计算机上执行特定的命令、窃取密码等。HID:是指人体接口设备,常见的HID包括键盘、鼠标、摄像头等USB设备......
  • kubernetes部署nexus
    1.NexusVolumecat>nexus-volume.yaml<<EOF---apiVersion:v1kind:PersistentVolumeClaimmetadata:name:nexus-data-pvcnamespace:kube-opsspec:accessModes:-ReadWriteMany#指定storageClass的名字,这里使用默认的standardstorageClassName......
  • 在Web里面用Jasper导出Pdf、HTML、Excel,以及参数说明
    参考:[color=red]ireport导出各种格式(pdf,excel,word,html,print)的例子[/color]:[url]http://mingxiao2010.blog.163.com/blog/static/861904812010665366872/[/url]说明:PDF:JRAbstractExporterexporter=newJRPdfExporter();Excel:JRAbstractExpor......
  • kubernetes 部署SonarQube
    1.PostgreSQL参考博客:https://hanggi.me/post/kubernetes/k8s-postgresql1.1.配置PostgreSQL的ConfigMapcat>postgres-configmap.yaml<<EOFapiVersion:v1kind:ConfigMapmetadata:name:postgres-confignamespace:kube-opslabels:app:postgresd......
  • 从iReport到Jaspersoft Studio
    从5.5版本开始,JaspersoftStudio将取代iReport成为JasperReports官方设计器。iReport维护截止日期到2015年底,意味着不会再有新的功能增加进iReport,但会做一些关键bug的修复、更新。所幸的是基于eclipse的JaspersoftStudio同样开源、免费!Yeah!JaspersoftStudio是一个专为Jasper......