如何实现ASP.NET Core中全局异常拦截的完整步骤?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1017个文字,预计阅读时间需要5分钟。
前言:异常是一种运行时错误,当异常没有得到适当的处理时,很可能会导致程序意外终止。本文将探讨如何在ASP.NET Core MVC中实现全局异常处理。
如何在ASP.NET Core MVC中实现全局异常处理:
1. 创建一个全局异常处理类
2.在Startup.cs文件中配置全局异常处理中间件
3.使用try-catch块处理异常
以下是一段示例代码:
csharp
public class GlobalExceptionHandler{ public static void ConfigureExceptionHandling(IApplicationBuilder app) { app.UseExceptionHandler(/Home/Error);app.Use(async (context, next)=> { context.Response.ContentType=text/;
await context.Response.WriteAsync(); await context.Response.WriteAsync(); await context.Response.WriteAsync(); await context.Response.WriteAsync(); await context.Response.WriteAsync(); await context.Response.WriteAsync(Global Exception Handler); await context.Response.WriteAsync(); await context.Response.WriteAsync(); await context.Response.WriteAsync(Oops! Something went wrong.); await context.Response.WriteAsync(
Our team is working on it.
); await context.Response.WriteAsync(); await context.Response.WriteAsync(); }); }}在Startup.cs文件中配置全局异常处理中间件:
csharppublic void ConfigureServices(IServiceCollection services){ // 其他服务配置}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env){ if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler(/Home/Error); }
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
// 配置全局异常处理 GlobalExceptionHandler.ConfigureExceptionHandling(app);
app.UseEndpoints(endpoints=> { endpoints.MapControllerRoute( name: default, pattern: {controller=Home}/{action=Index}/{id?}); });}
这样,当应用程序遇到异常时,将会显示一个全局的错误页面,而不是使程序崩溃。
前言
异常是一种运行时错误,当异常没有得到适当的处理,很可能会导致你的程序意外终止,这篇就来讨论一下如何在 ASP.Net Core MVC 中实现全局异常处理,我会用一些 样例代码 和 截图 来说明这些概念。
全局异常处理
其实在 ASP.Net Core MVC 框架中已经有了全局异常处理的机制,你可以在一个中心化的地方使用 全局异常处理中间件 来进行异常拦截,如果不用这种中心化方式的话,你就只能在 Controller 或者 Action 作用域上单独处理,这会导致异常处理代码零散在项目各处,不好维护也特别麻烦,不是吗?
第二种处理 全局异常 的做法就是使用 exception filter,在本篇中,我准备跟大家聊一聊 全局异常处理中间件 和 UseExceptionHandler 方法来管控异常。
使用 UseExceptionHandler 扩展方法
UseExceptionHandler 扩展方法能够将 ExceptionHandler 中间件注册到 Asp.net Core 的 请求处理管道 中,然后在 IExceptionHandlerFeature 接口的实例中获取 异常对象,下面的代码片段展示了如何使用 UseExceptionHandler 方法来截获全局异常。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseExceptionHandler(builder => { builder.Run(async context => { context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; context.Response.ContentType = "application/json"; var exception = context.Features.Get<IExceptionHandlerFeature>(); if (exception != null) { var error = new ErrorMessage() { Stacktrace = exception.Error.StackTrace, Message = exception.Error.Message }; var errObj = JsonConvert.SerializeObject(error); await context.Response.WriteAsync(errObj).ConfigureAwait(false); } }); } ); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); }
下面是代码中引用的 ErrorMessage 类的定义。
public class ErrorMessage { public string Message { get; set; } public string Stacktrace { get; set; } }
配置 全局异常中间件
大家都知道,ASP.Net Core MVC 项目中都会有一个 Startup.cs 文件,可以在 Configure 方法下配置 全局异常拦截中间件 代码,如下所示:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Error"); } app.UseStaticFiles(); app.UseCookiePolicy(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); }
可以着重看一下上面的 app.UseExceptionHandler("/Error"); ,这里的 UseExceptionHandler 实现了 pipeline 注册,一旦应用程序出现了未处理异常,那么会自动将 用户 导向 /Error 页面。
你可以用 UseStatusCodePagesWithReExecute 扩展方法给 pipeline 添加一些状态码页面,这是什么意思呢? 其实也就是 www.infoworld.com/art...
更多高质量干货:参见我的 GitHub:dotnetfly
到此这篇关于ASP.NET Core中实现全局异常拦截的文章就介绍到这了,更多相关ASP.NET Core全局异常拦截内容请搜索易盾网络以前的文章或继续浏览下面的相关文章希望大家以后多多支持易盾网络!
本文共计1017个文字,预计阅读时间需要5分钟。
前言:异常是一种运行时错误,当异常没有得到适当的处理时,很可能会导致程序意外终止。本文将探讨如何在ASP.NET Core MVC中实现全局异常处理。
如何在ASP.NET Core MVC中实现全局异常处理:
1. 创建一个全局异常处理类
2.在Startup.cs文件中配置全局异常处理中间件
3.使用try-catch块处理异常
以下是一段示例代码:
csharp
public class GlobalExceptionHandler{ public static void ConfigureExceptionHandling(IApplicationBuilder app) { app.UseExceptionHandler(/Home/Error);app.Use(async (context, next)=> { context.Response.ContentType=text/;
await context.Response.WriteAsync(); await context.Response.WriteAsync(); await context.Response.WriteAsync(); await context.Response.WriteAsync(); await context.Response.WriteAsync(); await context.Response.WriteAsync(Global Exception Handler); await context.Response.WriteAsync(); await context.Response.WriteAsync(); await context.Response.WriteAsync(Oops! Something went wrong.); await context.Response.WriteAsync(
Our team is working on it.
); await context.Response.WriteAsync(); await context.Response.WriteAsync(); }); }}在Startup.cs文件中配置全局异常处理中间件:
csharppublic void ConfigureServices(IServiceCollection services){ // 其他服务配置}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env){ if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler(/Home/Error); }
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
// 配置全局异常处理 GlobalExceptionHandler.ConfigureExceptionHandling(app);
app.UseEndpoints(endpoints=> { endpoints.MapControllerRoute( name: default, pattern: {controller=Home}/{action=Index}/{id?}); });}
这样,当应用程序遇到异常时,将会显示一个全局的错误页面,而不是使程序崩溃。
前言
异常是一种运行时错误,当异常没有得到适当的处理,很可能会导致你的程序意外终止,这篇就来讨论一下如何在 ASP.Net Core MVC 中实现全局异常处理,我会用一些 样例代码 和 截图 来说明这些概念。
全局异常处理
其实在 ASP.Net Core MVC 框架中已经有了全局异常处理的机制,你可以在一个中心化的地方使用 全局异常处理中间件 来进行异常拦截,如果不用这种中心化方式的话,你就只能在 Controller 或者 Action 作用域上单独处理,这会导致异常处理代码零散在项目各处,不好维护也特别麻烦,不是吗?
第二种处理 全局异常 的做法就是使用 exception filter,在本篇中,我准备跟大家聊一聊 全局异常处理中间件 和 UseExceptionHandler 方法来管控异常。
使用 UseExceptionHandler 扩展方法
UseExceptionHandler 扩展方法能够将 ExceptionHandler 中间件注册到 Asp.net Core 的 请求处理管道 中,然后在 IExceptionHandlerFeature 接口的实例中获取 异常对象,下面的代码片段展示了如何使用 UseExceptionHandler 方法来截获全局异常。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseExceptionHandler(builder => { builder.Run(async context => { context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; context.Response.ContentType = "application/json"; var exception = context.Features.Get<IExceptionHandlerFeature>(); if (exception != null) { var error = new ErrorMessage() { Stacktrace = exception.Error.StackTrace, Message = exception.Error.Message }; var errObj = JsonConvert.SerializeObject(error); await context.Response.WriteAsync(errObj).ConfigureAwait(false); } }); } ); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); }
下面是代码中引用的 ErrorMessage 类的定义。
public class ErrorMessage { public string Message { get; set; } public string Stacktrace { get; set; } }
配置 全局异常中间件
大家都知道,ASP.Net Core MVC 项目中都会有一个 Startup.cs 文件,可以在 Configure 方法下配置 全局异常拦截中间件 代码,如下所示:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Error"); } app.UseStaticFiles(); app.UseCookiePolicy(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); }
可以着重看一下上面的 app.UseExceptionHandler("/Error"); ,这里的 UseExceptionHandler 实现了 pipeline 注册,一旦应用程序出现了未处理异常,那么会自动将 用户 导向 /Error 页面。
你可以用 UseStatusCodePagesWithReExecute 扩展方法给 pipeline 添加一些状态码页面,这是什么意思呢? 其实也就是 www.infoworld.com/art...
更多高质量干货:参见我的 GitHub:dotnetfly
到此这篇关于ASP.NET Core中实现全局异常拦截的文章就介绍到这了,更多相关ASP.NET Core全局异常拦截内容请搜索易盾网络以前的文章或继续浏览下面的相关文章希望大家以后多多支持易盾网络!

