Configure、中间件与ErrorHandlingMiddleware全局异常捕获
一、Configure
Startup.cs中的Configure方法主要是http处理管道配置、中间件和一些系统配置,其中
IApplicationBuilder: 定义一个类,该类提供配置应用程序请求的机制管道。通过IApplicationBuilder下的run、use方法传入管道处理方法。这是最常用方法,对于一个真实环境的应用基本上都需要比如权限验证、跨域、异常处理等。
IHostingEnvironment:提供有关正在运行的应用程序的web托管环境的信息
简单来说Configure方法就是来加载一些中间件以及处理一些管道配置和系统配置的,下面看下什么是中间件。
二、Middleware
Middleware 中间件是一个处理http请求和响应的组件,多个中间件构成了处理管道(Handler pipeline),每个中间件可以决定是否传递至管道中的下一中间件。
注册--一旦注册中间件后,每次请求和响应均会被调用。中间件的注册在startup中的Configure方法完成,在configure方法中使用IApplicationBuilder对象的Run、Map、Use方法传入匿名委托(delegate)。
具体例子我们一起看下ErrorHandlingMiddleware,如何注册中间件的以及使用的。
三、ErrorHandlingMiddleware
3.1、为什么使用ErrorHandlingMiddleware全局异常捕获
有些时候项目总会出现一些始料未及的错误,项目启动瞬间崩塌。一脸懵,都不知道咋回事。刚启动就完事儿了。还有的情况测试接口的时候,打了断点,然后运行项目。偏偏死活不进断点。结果返回一个200ok,
甚是恼火。这时候ErrorHandlingMiddleware就起作用了,不管应该运行如何,至少会进入ErrorHandlingMiddleware方法,一旦报错也会出现错误信息,这样我们也就能好快的解决问题。而且ErrorHandlingMiddleware简单,方便快捷。
3.2、构建ErrorHandlingMiddleware方法
public class ErrorHandlingMiddleware { private readonly RequestDelegate next; public ErrorHandlingMiddleware(RequestDelegate next) { this.next = next; } public async Task Invoke(HttpContext context /* other dependencies */) { try { await next(context); } catch (Exception ex) { await HandleExceptionAsync(context, ex); } } private static Task HandleExceptionAsync(HttpContext context, Exception ex) { var code = HttpStatusCode.InternalServerError; // 500 if unexpected var Info = ""; switch (context.Response.StatusCode) { case 401: Info = "没有权限"; break; case 404: Info = "未找到服务"; break; case 403: Info = "服务器理解请求客户端的请求,但是拒绝执行此请求"; break; case 500: Info = "服务器内部错误,无法完成请求"; break; case 502: Info = "请求错误"; break; default: Info = "内部错误"; break; } LogHelp.Error(ex); var result = JsonConvert.SerializeObject(new { error = ex.Message }); context.Response.ContentType = "application/json"; context.Response.StatusCode = (int)code; return context.Response.WriteAsync(result); } }
不管如何,项目运行了都会进入Invoke方法,一旦出现错误的话就会进入HandleExceptionAsync方法,记录错误然后返回错误信息
3.3、注册中间件使用
在Startup.cs中的Configure方法中加上中间件的注册。
app.UseMiddleware(typeof(ErrorHandlingMiddleware));
然后就可以尝试下了,在Invoke方法打上断点,然后运行项目,会发现,项目会先运行到Invoke方法。
欢迎大家扫描下方二维码,和我一起学习更多的知识😊
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?