为什么不创建自定义中间件?
这里我们创建 AppExceptionHandlerMiddleware。如果您在开发环境中或者您有管理员 cookie,它会显示异常详细信息。
AppExceptionHandlerMiddleware.cs
public class AppExceptionHandlerMiddleware
{
private readonly RequestDelegate _next;
private readonly IWebHostEnvironment _env;
private readonly DeveloperExceptionPageMiddleware developerExceptionPageMiddleware;
private readonly ExceptionHandlerMiddleware exceptionHandlerMiddleware;
public AppExceptionHandlerMiddleware(RequestDelegate next, IOptions<DeveloperExceptionPageOptions> dexhOptions,
IOptions<ExceptionHandlerOptions> exhOptions, ILoggerFactory loggerFactory, IWebHostEnvironment env,
DiagnosticListener diagnosticListener, DiagnosticSource diagnosticSource, IEnumerable<IDeveloperPageExceptionFilter> filters)
{
_next = next;
_env = env;
developerExceptionPageMiddleware = new DeveloperExceptionPageMiddleware(next, dexhOptions, loggerFactory, env, diagnosticSource, filters);
exceptionHandlerMiddleware = new ExceptionHandlerMiddleware(next, loggerFactory, exhOptions, diagnosticListener);
}
public async Task Invoke(HttpContext context)
{
if (context.Request.Cookies["admin"] == ReadonlyJsonService.Root.adminCookie || _env.IsDevelopment())
{
await developerExceptionPageMiddleware.Invoke(context);
}
else
{
await exceptionHandlerMiddleware.Invoke(context);
}
}
}
AppExceptionHandlerExtensions.cs
public static class AppExceptionHandlerExtensions
{
public static IApplicationBuilder UseAppExceptionHandler(
this IApplicationBuilder builder)
{
return builder.UseMiddleware<AppExceptionHandlerMiddleware>();
}
}
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
...
//Config ExceptionHandlerMiddlewareOption via DI.
services.Configure<ExceptionHandlerOptions>(option =>
{
option.ExceptionHandlingPath = new PathString("/Error");
});
...
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseAppExceptionHandler();
...
}