如何将用户重定向到错误页面并在 .NET Core 的日志文件中记录错误

How to redirect user to Error page and log errors in log file in .NET core

我正在开发 .NET 核心 Web 应用程序,我的要求是全局处理错误。

因此,为了实现此行为,我尝试使用内置中间件 UseExceptionHandler along with ExceptionHandlerOptions

Startup.cs

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler(new ExceptionHandlerOptions {
                    ExceptionHandlingPath = "/Home/Error",
                    ExceptionHandler = async (context) => {
                        var exceptionFeature = context.Features.Get<IExceptionHandlerFeature>();
                        if (exceptionFeature != null)
                        {
                            Log.Error(exceptionFeature.Error, exceptionFeature.Error.Message);
                        }
                    }
                });
            }
     }

以上代码将错误记录在日志文件中,但从不将用户重定向到错误页面。当我删除 ExceptionHandler 函数时,它工作正常并将用户重定向到错误页面。如果我遗漏了什么,请纠正我。

我希望用户在发生任何未处理的异常时重定向到错误页面并将错误记录在日志文件中。

我解决这个问题的方法:

Startup.cs

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

HomeController.cs

public async Task<IActionResult> Error(string errorId)
        {
            var exceptionFeature = HttpContext.Features.Get<IExceptionHandlerFeature>();
            if (exceptionFeature != null)
            {
                Log.Error(exceptionFeature.Error, exceptionFeature.Error.Message);
            }
       }

以上解决方案适用于我,但在控制器中记录全局错误是好的做法吗?任何潜在客户都会得到认可。

谢谢!

这两个属性是互斥的, ExceptionHandlingPath = "/Home/Error", 异常处理器 即,将应用其中任何一个,这就是为什么 home/error 中没有发生重定向的原因。如果您将删除 exceptionHandler,它会为您工作,但是您需要在控制器中进行登录,这是您执行的第二个实现的一部分,并且以这种方式登录直到 controller/action 处理一切。

当我说出所有内容时,这意味着存在 401 错误、404 错误,当前方法无法处理这些错误,为此您应该使用 statusCode 基本方法。

更好的方法是你有多个错误页面的实现: 1. 404:路由不存在 2. 500:应用程序错误(所有情况) 3 401 : 如果涉及某种授权。

.net core提供了很多错误处理机制(包括用于异常处理的Globalfilter属性)。但是,如果您有面向 public 的应用程序,您应该向用户显示友好的错误页面并记录休息。

你可以阅读它here