一、使用场景

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

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

<configuration><system.web><compilation debug="true" /><customErrors mode="On" defaultRedirect="DefaultError"><error statusCode="401" redirect="Http401Error"/><error statusCode="403" redirect="Http403Error"/><error statusCode="404" redirect="Http404Error"/><error statusCode="500" redirect="Http500Error"/></customErrors></system.web>
</configuration>

二、.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<int, string> ErrorPages { get; } = new Dictionary<int, string>();

  配置文件中定义的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<CustomErrorPagesMiddleware>();}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<CustomErrorPagesMiddleware>();}
}

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

app.UseCustomErrorPages();

三、源代码

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

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

  开源推广:  

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

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

  GitHub:https://github.com/maxzhang1985/YOYOFx  Star下, 欢迎一起交流。 .NET Core 和 YOYOFx 的交流群: 214741894

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

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

在ASP.NET Core使用Middleware模拟Custom Error Page功能相关推荐

  1. 利用Asp.Net Core的MiddleWare思想处理复杂业务流程

    最近利用Asp.Net Core 的MiddleWare思想对公司的古老代码进行重构,在这里把我的设计思路分享出来,希望对大家处理复杂的流程业务能有所帮助. 背景 一个流程初始化接口,接口中根据传入的 ...

  2. ASP.NET Core中间件(Middleware)实现WCF SOAP服务端解析

    ASP.NET Core中间件(Middleware)进阶学习实现SOAP 解析. 本篇将介绍实现ASP.NET Core SOAP服务端解析,而不是ASP.NET Core整个WCF host. 因 ...

  3. 学习ASP.NET Core Razor 编程系列九——增加查询功能

    原文:学习ASP.NET Core Razor 编程系列九--增加查询功能 学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.N ...

  4. ASP.Net Core 2.0中的Razor Page不是WebForm

    随着.net core2.0的发布,我们可以创建2.0的web应用了.2.0中新东西的出现,会让我们忘记老的东西,他就是Razor Page.下面的这篇博客将会介绍ASP.Net Core 2.0中的 ...

  5. ASP.NET Core 集成测试中模拟登录用户的一种姿势

    不管哪种用户验证方式,最终都是在验证成功后设置 HttpContext.User ,后续处理环节通过 HttpContext.User 获取用户信息.如果能直接修改 HttpContext.User ...

  6. ASP.NET Core -中间件(Middleware)使用

    ASP.NET Core开发,开发并使用中间件(Middleware). 中间件是被组装成一个应用程序管道来处理请求和响应的软件组件. 每个组件选择是否传递给管道中的下一个组件的请求,并能之前和下一组 ...

  7. Asp.Net Core Authentication Middleware And Generate Token

    或者应该包含什么信息呢? 1.这个人是谁? 2.这个人可以用此token访问什么样的内容?(scope) 3.token的过期时间 (expire) 4.谁发行的token. 5.其他任何你希望加入的 ...

  8. ASP.NET Core 单元测试:如何Mock Url.Page()

    点击上方蓝字关注"汪宇杰博客" 导语 在 ASP.NET Core 中,当你在 UrlHelperExtensions 类上使用扩展方法时,很难在单元测试中编写Mock.因为Moq ...

  9. asp.net core集成CKEditor实现图片上传功能

    背景 本文为大家分享了asp.net core 如何集成CKEditor ,并实现图片上传功能的具体方法,供大家参考,具体内容如下. 准备工作 1.visual studio 2019 开发环境 2. ...

最新文章

  1. 剑指offer:翻转单词顺序列
  2. SQL語句大全4(常用函數)
  3. 清除tomcat的缓存
  4. 洛谷 P4175: bzoj 1146: [CTSC2008]网络管理
  5. 关于浮点数精度的问题
  6. 什么是Flink?Flink能用来做什么?
  7. 为什么“三次握手,四次挥手”?
  8. 使用While循环语句值得注意的事
  9. clion配置opencv3.20(cmake+tdm-gcc)
  10. oracle转mysql总结,原理+实战+视频+源码
  11. 读书笔记 - 《漫威宇宙》
  12. Ubuntu下VIM的安装和基本用法
  13. python刻度增加1个数_Matplotlib添加一个特定的勾号,表示轴的最大多个刻度单次观察...
  14. 计算机版音乐教学,EduOffice音乐教学备课软件
  15. 保付代理和供应链金融业务大纲
  16. 焱融科技与趋动科技携手解决一站式存算难
  17. 冈萨雷斯《数字图像处理matlab版》(一):绪言
  18. UG/NX二次开发入门手册
  19. 【整理】3dsMax中贴图显示模糊
  20. 程序员必读:“五险一金”详解!

热门文章

  1. jQuery.Form.js 异步提交表单使用总结
  2. 【Qt】Qt之进程间通信(Windows消息)【转】
  3. Java中常用的集合
  4. Mvc 学习笔记(一)
  5. C#获取txt记事本内容,防止乱码情况
  6. print\println\printf的区别
  7. Quartz实现定时功能 job.xml文件的配置
  8. Windows SDK编程之一 窗口示例程序
  9. Android 6.0及以上版本动态申请权限,11权限
  10. Java 计算两个日期时间差,天数、时、分、秒