【问题标题】:ASP.NET Core Razor - Global Exception HandlerASP.NET Core Razor - 全局异常处理程序
【发布时间】:2020-12-03 12:55:43
【问题描述】:

我有以下部分适用于 .cshtml.cs 但不适用于 .cshtml 文件:

我需要更改我的GlobalExceptionFilter 还是需要添加其他内容来捕获.cshtml 错误?

对于这两个错误,它们都会重定向到 /Error 页面。

public class GlobalExceptionFilter : IExceptionFilter
{       
    public void OnException(ExceptionContext context)
    {
        LogError(context.Exception);
    }
}

Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvcOptions(options =>
                {
                    options.Filters.Add<GlobalExceptionFilter>();
                });
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
        }
}

Index.cshtml.cs:

public void OnGet()
{
    throw new Exception("Test"); //This hits GlobalExceptionFilter
}

Index.cshtml:

@{
    throw new Exception("Test"); //This does NOT hit GlobalExceptionFilter
}

提前致谢

【问题讨论】:

    标签: c# asp.net-core exception razor


    【解决方案1】:

    异常过滤器将全局策略应用于在响应正文被写入之前发生的未处理异常。

    异常过滤器:

    适用于捕获动作中发生的异常。

    不如错误处理中间件灵活。

    你可以从doc看到它。

    您可以在这里使用自定义的 ExceptionHandler 中间件,如下所示:

    public class CustomExceptionHandler
    {
        private readonly IWebHostEnvironment _environment;
        
        public CustomExceptionHandler(IWebHostEnvironment environment)
        {
            _environment = environment;
        }
    
        public async Task Invoke(HttpContext httpContext)
        {
                var feature = httpContext.Features.Get<Microsoft.AspNetCore.Diagnostics.IExceptionHandlerFeature>();
                var error = feature?.Error;
    
                if(error != null)
                {                    
                    LogError(error);
                    throw error;
                }
    
                await Task.CompletedTask;
        }
    }
    

    在 startup.cs 中使用它

    app.UseExceptionHandler(new ExceptionHandlerOptions
    {
        ExceptionHandler = new CustomExceptionHandler(env).Invoke
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-14
      • 1970-01-01
      • 2019-11-05
      • 2014-04-17
      • 2012-12-31
      • 2011-05-19
      • 2011-08-31
      • 2010-12-05
      相关资源
      最近更新 更多