ASP.NET Core中显示自定义错误页面-增强版

2016-12-28 10:11:14来源:作者:博客园-dudu人点击

之前的博文 ASP.NET Core中显示自定义错误页面中的方法是在项目中硬编码实现的,当有多个项目时,就会造成不同项目之间的重复代码,不可取。

在这篇博文中改用middleware实现,并且放在独立的项目中发布成NuGet包,项目中使用时只需安装NuGet包,然后在Startup的Configure()方法中添加如下的一行代码。

app.UseCustomErrorPages();

CustomErrorPagesMiddleware的实现代码如下:

public class CustomErrorPagesMiddleware{ private readonly RequestDelegate _next; private readonly ILogger _logger; public CustomErrorPagesMiddleware( RequestDelegate next, ILoggerFactory loggerFactory) { _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 (statusCode == 404 || statusCode == 500) { await ErrorPage.ResponseAsync(context.Response, statusCode); } } }}

ErrorPage的实现代码如下:

public static class ErrorPage{ public static async Task ResponseAsync(HttpResponse response, int statusCode) { if (statusCode == 404) { await response.WriteAsync(Page404); } else if (statusCode == 500) { await response.WriteAsync(Page500); } } private static string Page404 => @"html..."; private static string Page500 => @"html...";}

CustomErrorPagesExtensions的实现代码如下:

public static class CustomErrorPagesExtensions{ public static IApplicationBuilder UseCustomErrorPages(this IApplicationBuilder app) { if (app == null) { throw new ArgumentNullException(nameof(app)); } return app.UseMiddleware<CustomErrorPagesMiddleware>(); }}

代码参考自:

1) CustomErrorPagesMiddleware.cs

2) DeveloperExceptionPageMiddleware.cs

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台