博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在ASP.NET Core使用Middleware模拟Custom Error Page功能
阅读量:5127 次
发布时间:2019-06-13

本文共 3983 字,大约阅读时间需要 13 分钟。

一、使用场景

  在传统的ASP.NET MVC中,我们可以使用HandleErrorAttribute特性来具体指定如何处理Action抛出的异常.只要某个Action设置了HandleErrorAttribute特性,那么默认的,当这个Action抛出了异常时MVC将会显示Error视图,该视图位于~/Views/Shared目录下。

  自定义错误页面的目的,就是为了能让程序在出现错误/异常的时候,能够有较好的显示体验。有时候在Error视图中也会发生错误,这时ASP.NET/MVC将会显示其默认的错误页面(黄底红字),为了避免这种情况的出现,我们都是在Web.config文件的customErrors节中来自定义错误页面,来启用自定义错误处理:

 

二、.NET Core实现

  既然想用ASP.NET Core中的中间件模拟Custom Error Page功能,那首先我从配置下手。大家都知道.NET Core中配置文件系统发生了很大的变化,默认都是采用Json格式的文件进行存储的,当然配置文件也可以是其它类型的,这里我们就不深入探讨了,我们就围绕Json配置文件实现好了:

"ErrorPages": {  "401": "/Error/Http401Page",  "403": "/Error/Http403Page",  "404": "/Error/Http404Page",  "500": "/Error/Http500Page"}

  我们在Startup类中定义两个变量,用来存储配置文件读取出来的信息如下:

public IConfigurationRoot Configuration { get; }internal static IDictionary
ErrorPages { get; } = new Dictionary
();

  配置文件中定义的ErrorPages节点,用于存储我们需要的Http状态编码并包含使用到的错误页面地址, 将他们用Startup类中的ErrorPages变量使用Key/Value的形式,读取出来。

  接下来我们要从JSON配置文件中读取信息填充到ErrorPages:

var builder = new ConfigurationBuilder()    .SetBasePath(env.ContentRootPath)    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)    .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)    .AddEnvironmentVariables();Configuration = builder.Build();foreach (var c in Configuration.GetSection("ErrorPages").GetChildren()){    var key = Convert.ToInt32(c.Key);    if (!ErrorPages.Keys.Contains(key))    {        ErrorPages.Add(key, c.Value);    }}

  现在我们使用今天的主角,创建一个ASP.NET Core的Middleware,用于实现Custom Error Page功能:

public class CustomErrorPagesMiddleware{    private readonly RequestDelegate _next;    private readonly ILogger _logger;    public CustomErrorPagesMiddleware(ILoggerFactory loggerFactory, RequestDelegate next)    {        _next = next;        _logger = loggerFactory.CreateLogger
(); } public async Task Invoke(HttpContext context) { try { await _next(context); } catch (Exception ex) { _logger.LogError(0, ex, "An unhandled exception has occurred while executing the request"); if (context.Response.HasStarted) { _logger.LogWarning("The response has already started, the error page middleware will not be executed."); throw; } try { context.Response.Clear(); context.Response.StatusCode = 500; return; } catch (Exception ex2) { _logger.LogError(0, ex2, "An exception was thrown attempting to display the error page."); } throw; } finally { var statusCode = context.Response.StatusCode; if (Startup.ErrorPages.Keys.Contains(statusCode)) { context.Request.Path = Startup.ErrorPages[statusCode]; await _next(context); } } }

  这样就完成了,从响应Response的StatusCode到配置的具体页面的跳转。

  当然我们最后,还要为这个中间件添加一个扩展方法,ASP.NET Core中为 IApplictionBuilder创建了好多的扩展方法,其实也好比它的名子一样,它就应该是一个建造者模式。

  扩展方法如下:

 

public static class BuilderExtensions{    public static IApplicationBuilder UseCustomErrorPages(this IApplicationBuilder app)    {        return app.UseMiddleware
(); }}

 

  最后在Startup类中的Configure方法中加入自定义错误的扩展:

app.UseCustomErrorPages();

三、源代码

  如果你对文中的代码感兴趣,也可以到我的Github上去看下这个例子的源代码:

 

------------------分割线--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  开源推广:  

  YOYOFx,一个轻量级用于构建基于 HTTP 的 Web 服务,支持.NET Framework 、.NET  CORE、 Mono 平台。

  本着学习的态度,造了这个轮子,也是为了更好的了解各个框架的原理和有点,还希望可以和大家多交流 。

  GitHub:  Star下, 欢迎一起交流。 .NET Core 和 YOYOFx 的交流群:   

  如果你觉得本文对你有帮助,请点击“推荐”,谢谢。

 

转载于:https://www.cnblogs.com/maxzhang1985/p/5974429.html

你可能感兴趣的文章
免费的论文查重网站
查看>>
C语言程序第一次作业
查看>>
leetcode-Sort List
查看>>
中文词频统计
查看>>
了解node.js
查看>>
想做移动开发,先看看别人怎么做
查看>>
Eclipse相关集锦
查看>>
虚拟化架构中小型机构通用虚拟化架构
查看>>
继承条款effecitve c++ 条款41-45
查看>>
Java泛型的基本使用
查看>>
1076 Wifi密码 (15 分)
查看>>
noip模拟赛 党
查看>>
bzoj2038 [2009国家集训队]小Z的袜子(hose)
查看>>
Java反射机制及其Class类浅析
查看>>
Postman-----如何导入和导出
查看>>
移动设备显示尺寸大全 CSS3媒体查询
查看>>
图片等比例缩放及图片上下剧中
查看>>
【转载】Linux screen 命令详解
查看>>
background-clip,background-origin
查看>>
Android 高级UI设计笔记12:ImageSwitcher图片切换器
查看>>