[转]在ASP.NET Core使用Middleware模拟Custom Error Page功能
本文转自:http://www.cnblogs.com/maxzhang1985/p/5974429.html
阅读目录
一、使用场景
在传统的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
[转]在ASP.NET Core使用Middleware模拟Custom Error Page功能的更多相关文章
- 在ASP.NET Core使用Middleware模拟Custom Error Page功能
一.使用场景 在传统的ASP.NET MVC中,我们可以使用HandleErrorAttribute特性来具体指定如何处理Action抛出的异常.只要某个Action设置了HandleErrorAtt ...
- ASP.NET Core中间件(Middleware)实现WCF SOAP服务端解析
ASP.NET Core中间件(Middleware)进阶学习实现SOAP 解析. 本篇将介绍实现ASP.NET Core SOAP服务端解析,而不是ASP.NET Core整个WCF host. 因 ...
- 利用Asp.Net Core的MiddleWare思想处理复杂业务流程
最近利用Asp.Net Core 的MiddleWare思想对公司的古老代码进行重构,在这里把我的设计思路分享出来,希望对大家处理复杂的流程业务能有所帮助. 背景 一个流程初始化接口,接口中根据传入的 ...
- ASP.NET Core中Middleware的使用
https://www.cnblogs.com/shenba/p/6361311.html ASP.NET 5中Middleware的基本用法 在ASP.NET 5里面引入了OWIN的概念,大致意 ...
- 创建ASP.NET Core MVC应用程序(5)-添加查询功能 & 新字段
创建ASP.NET Core MVC应用程序(5)-添加查询功能 & 新字段 添加查询功能 本文将实现通过Name查询用户信息. 首先更新GetAll方法以启用查询: public async ...
- ASP.NET Core 集成测试中模拟登录用户的一种姿势
不管哪种用户验证方式,最终都是在验证成功后设置 HttpContext.User ,后续处理环节通过 HttpContext.User 获取用户信息.如果能直接修改 HttpContext.User ...
- Asp.Net Core Authentication Middleware And Generate Token
.mytitle { background: #2B6695; color: white; font-family: "微软雅黑", "宋体", "黑 ...
- ASP.NET Core 入门教程 9、ASP.NET Core 中间件(Middleware)入门
一.前言 1.本教程主要内容 ASP.NET Core 中间件介绍 通过自定义 ASP.NET Core 中间件实现请求验签 2.本教程环境信息 软件/环境 说明 操作系统 Windows 10 SD ...
- ASP.NET Core -中间件(Middleware)使用
ASP.NET Core开发,开发并使用中间件(Middleware). 中间件是被组装成一个应用程序管道来处理请求和响应的软件组件. 每个组件选择是否传递给管道中的下一个组件的请求,并能之前和下一组 ...
随机推荐
- 20165219 2017-2018-2《Java程序设计》结对编程一 第一周总结
20165219 2017-2018-2<Java程序设计>结对编程一 第一周总结 结对对象 20165219王彦博 20165232何彦达 需求分析 实现一个程序,要求: 1 支持整数运 ...
- LNMP(linux+nginx+mysql+php)服务器环境配置【转载】
本文转载自 园友David_Tang的博客,如有侵权请联系本人及时删除,原文地址: http://www.cnblogs.com/mchina/archive/2012/05/17/2507102.h ...
- luoguP3648 [APIO2014]序列分割
https://www.luogu.org/problemnew/show/P3648 同bzoj3675 这题斜率优化+滚动数组就可以了qwq 因为我是在飞机上瞎bb的式子,所以可能会和别的题解的式 ...
- 洛谷P3254 圆桌问题(最大流)
传送门 一道良心啊……没那么多麻烦了…… 从$S$向所有单位连边,容量为单位人数,从所有桌子向$T$连边,容量为桌子能坐的人数,从每一个单位向所有桌子连边,容量为$1$,然后跑一个最大流,看一看$S$ ...
- 基于SSH协议clone GitHub远端仓库到本地-git
经常逛 GitHub 的可能都知道,在 clone 远端仓库的时候,会有两个选项,如下图: 首先我们来说明一下两种方式的区别. 使用 HTTPS url 克隆对初学者来说会比较方便,复制HTTPS u ...
- 《Andrew Ng深度学习》笔记1
深度学习概论 1.什么是神经网络? 2.用神经网络来监督学习 3.为什么神经网络会火起来? 1.什么是神经网络? 深度学习指的是训练神经网络.通俗的话,就是通过对数据的分析与计算发现自变量与因变量的映 ...
- rpm命令-以jenkins为例
1.列出所有安装的Jenkins rpm -qa | grep jenkins 2.软件是否安装:例如:jenkins是否安装 rpm -qa | grep jenkins 3.rpm -ql 列出软 ...
- Linux环境查看系统参数
一.查看CPU信息 lscpu cat /proc/cpuinfo 二.查看CPU位数 getconf LONG_BIT 三.查看MEM信息 free free -m cat /proc/me ...
- oracle数据库修改密码
忘记了数据库的登录密码,oracle数据库无法登录了. 先删除原先的密码保存文件: del E:\oracle_app\Administrator\product\11.2.0\dbhome_1\da ...
- 设计模式学习总结(八)策略模式(Strategy)
策略模式,主要是针对不同的情况采用不同的处理方式.如商场的打折季,不同种类的商品的打折幅度不一,所以针对不同的商品我们就要采用不同的计算方式即策略来进行处理. 一.示例展示: 以下例子主要通过对手机和 ...