繁体   English   中英

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

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

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

因此,为了实现此行为,我尝试将中间件UseExceptionHandler中的构建与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”,ExceptionHandler,即将应用其中一个,这就是为什么重定向不会在home / error中发生的原因。 如果要删除exceptionHandler,它将为您工作,但是您需要在控制器中进行日志记录,这是您执行的第二个实现的一部分,并且以这种方式记录日志直到此控制器/操作执行完为止没有危害。处理一切。

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

更好的方法是对错误页面进行多种实现:1. 404:不存在路由2. 500:应用程序错误(在所有情况下)3401:是否涉及某种授权。

.net核心提供了许多错误处理机制(包括用于异常处理的Globalfilter属性)。 但是,如果您有一个面向公众的应用程序,则应针对向用户显示友好的错误页面并记录休息。

你可以在这里阅读

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM