簡體   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