将开发人员异常页面显示为 IActionResult

Show developer exception page as IActionResult

Startup.cs中我有以下代码:

if (env.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
}
else
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

我希望我的应用程序在部署期间仍向管理员用户显示开发人员例外页面。

在我的 Error.cshtml.cs 中,我想要如下内容:

public IActionResult OnGet()
{
    if (Request.Cookies["admin"] == ReadonlyJsonService.Root.adminCookie)
    {
        // Show developer exception page.   
    }
    else
    {
        // Render Error.cshtml as would happen if I had just put 'public void OnGet() {}'
    }
}

为什么不创建自定义中间件?

这里我们创建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();

    ...
}