【问题标题】:Show developer exception page as IActionResult将开发人员异常页面显示为 IActionResult
【发布时间】:2021-11-04 19:00:22
【问题描述】:

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() {}'
    }
}

【问题讨论】:

    标签: asp.net exception


    【解决方案1】:

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

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

    【讨论】:

    • 完全按照要求工作。密钥是DeveloperExceptionPageMiddleware
    猜你喜欢
    • 2021-05-27
    • 2012-02-12
    • 2022-10-18
    • 2016-04-06
    • 1970-01-01
    • 2014-07-03
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多