ASP.NET Core中显示自定义错误页面-增强版
之前的博文 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>(); } }
代码参考自: