华域联盟 .Net ASP.NET Core中实现全局异常拦截的完整步骤

ASP.NET Core中实现全局异常拦截的完整步骤

ASP.NET Core中实现全局异常拦截的完整步骤
 更新时间:2021年01月05日 10:21:29   作者:一线码农  

这篇文章主要给大家介绍了关于ASP.NET Core中如何实现全局异常拦截的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言
异常是一种运行时错误,当异常没有得到适当的处理,很可能会导致你的程序意外终止,这篇就来讨论一下如何在 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 添加一些状态码页面,这是什么意思呢? 其实也就是 http 500 导向 500 页面, http 404 导向 404 页面,下面的代码片段展示了修改后的 Configure 方法代码。

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseStatusCodePagesWithReExecute("/Error/NotFound/{0}");
}

//Other code
}

使用 ErrorController

在 HomeController 下有一个专门处理错误的 action 方法,这里我们不使用这个 action,你可以把它删掉,接下来我准备定义一个专门的 ErrorController,里面包含了一个路由为 /Error 的 action 方法。

public class ErrorController : Controller
{
[HttpGet("/Error")] public IActionResult Index()
{
IExceptionHandlerPathFeature iExceptionHandlerFeature = HttpContext.Features.Get<IExceptionHandlerPathFeature>();

if (iExceptionHandlerFeature != null)
{
string path = iExceptionHandlerFeature.Path;
Exception exception = iExceptionHandlerFeature.Error;

//Write code here to log the exception details
return View("Error",iExceptionHandlerFeature);
}
return View();
}

[HttpGet("/Error/NotFound/{statusCode}")] public IActionResult NotFound(int statusCode)
{
var iStatusCodeReExecuteFeature =HttpContext.Features.Get<IStatusCodeReExecuteFeature>();
return View("NotFound",iStatusCodeReExecuteFeature.OriginalPath);
}
}

你可以用 IExceptionHandlerPathFeature 来获取异常相关信息,也可以用 IStatusCodeReExecuteFeature 来获取 http 404 异常时当时的请求路径,对了,要想用上 IExceptionHandlerPathFeature 和 IStatusCodeReExecuteFeature ,要记得在 nuget 上安装了 Microsoft.AspNetCore.Diagnostics 包,下面的代码展示了如何获取异常发生时刻的路由地址。

string route = iExceptionHandlerFeature.Path;

如果想获取异常的详细信息,可以使用如下语句。

var exception = HttpContext.Features.Get<IExceptionHandlerPathFeature>();

一旦获取了这个路由地址和异常的详细信息,就可以将它记录到你的日志文件中,可供后续仔细分析。
使用 View 展示错误信息

可以创建一个 View 来展示出现的错误信息,下面时 Error ViewPage 的详细代码。

@model Microsoft.AspNetCore.Diagnostics.IExceptionHandlerFeature
@{
ViewData["Title"] = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<div class="row">
<div class="text-danger">
<h3>Error: @Model.Error.Message</h3>
</div>
</div>
<div class="row">
<div class="col-12">
<p>@Model.Error.StackTrace</p>
<p>@Model.Error.InnerException</p>
</div>
</div>

下面是 NotFound 页面的 代码

@model string
@{
ViewData["Title"] = "NotFound";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h1 class="text-danger">
Error: The requested URL @Model was not found!</h1>
<hr />

现在可以把程序跑起来了,你会看到如下的错误信息。

如果你尝试打开一个不存在的页面, 会自动跳转到 ErrorController.NotFound 所包装的 404 描述信息。

ASP.NET Core 中内置了 全局异常处理,你可以利用这项技术在一个集中化的地方去截获你应用程序中的所有异常信息,当然你也可以基于环境的不同采取不用的异常处理措施,比如说:开发环境,测试环境,生产环境 等等。
译文链接: www.infoworld.com/art...
更多高质量干货:参见我的 GitHub:dotnetfly
到此这篇关于ASP.NET Core中实现全局异常拦截的文章就介绍到这了,更多相关ASP.NET Core全局异常拦截内容请搜索华域联盟以前的文章或继续浏览下面的相关文章希望大家以后多多支持华域联盟!

您可能感兴趣的文章:如何在Asp.Net Core中集成RefitASP.NET Core WebApi版本控制的实现ASP.NET Core对不同类型的用户进行区别限流详解详解如何在ASP.NET Core中编写高效的控制器详解如何在ASP.NET Core中使用IHttpClientFactoryASP.NET Core 使用Cookie验证身份的示例代码详解如何在ASP.NET Core Web API中以三种方式返回数据详解如何在ASP.NET Core中使用Route特性ASP.NET Core中如何实现重定向详解Asp.Net Core中创建多DbContext并迁移到数据库的步骤

asp.netcore
全局
异常

相关文章
ASP.NET MVC数组模型绑定详解这篇文章主要为大家详细介绍了ASP.NET MVC数组模型绑定的相关资料,感兴趣的小伙伴们可以参考一下 2016-04-04
asp.net 服务器控件的 ID,ClientID,UniqueID 的区别asp.net 服务器控件的 ID,ClientID,UniqueID 的区别分析,需要的朋友可以参考下。 2010-04-04
ASP.NET站点导航应用详解这篇文章主要内容是ASP.NET站点导航,主要包括站点导航以及动态修改内存中的站点地图,感兴趣的小伙伴们可以参考一下 2015-09-09
aspx实现的 jquery ui 的 flexgrid demo这几天没事研究着jquery,真是个好东西,慢慢的知道了有jquery ui,一开始就被华丽的界面和简单的操作给吸引了,尤其是里面的flexgrid,对我而言可以说是非常宝贵的东西 2009-12-12
关于.NET动态代理的介绍和应用简介关于.NET动态代理的介绍和应用简介... 2006-09-09
Visual studio 2017添加引用时报错未能正确加载ReferenceManager这篇文章主要介绍了VS2017添加引用时报错未能正确加载ReferenceManagerPackage包的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 2017-04-04
浅谈MVC框架的优点(翻译)这篇文章主要介绍了浅谈MVC框架的优点(翻译),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 2019-11-11
利用ASP.NET MVC和Bootstrap快速搭建响应式个人博客站(一)这篇文章主要介绍了利用ASP.NET MVC和Bootstrap快速搭建响应式个人博客站(一)的相关资料,需要的朋友可以参考下 2016-06-06
DataGridView单元格显示多行的设置方法DataGridView单元格显示多行的设置方法,需要的朋友可以参考下 2012-11-11
递归输出ASP.NET页面所有控件的类型和ID的代码递归输出ASP.NET页面所有控件的类型和ID的代码,需要的朋友可以参考下。 2012-01-01

最新评论

本文由 华域联盟 原创撰写:华域联盟 » ASP.NET Core中实现全局异常拦截的完整步骤

转载请保留出处和原文链接:https://www.cnhackhy.com/5003.htm

本文来自网络,不代表华域联盟立场,转载请注明出处。

作者:

发表回复

联系我们

联系我们

2551209778

在线咨询: QQ交谈

邮箱: [email protected]

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部