伺服器錯誤404解決方法「出現404錯誤頁面怎麼解決」

asp.net core mvc 對應著 .NET Framework 中的 ASP.NET MVC, 前者可以跨平台,可擴展,高性能,不過令人驚訝的是,雖然 ASP.NET Core 提供了大量的可選項可以完美的處理 404 錯誤,但 ASP.NET Core MVC 在默認情況下並沒有選擇它們,你說奇怪不?

這就造成了當請求一個不存在的頁面時,應用程序將會返回一個 404 錯誤,ASP.NET Core MVC 目前會展示一個瀏覽器通用的錯誤頁,如下圖所示:

如何在 ASP.NET Core 中處理 404 錯誤

這篇文章我準備討論 3種 方式來優雅的處理這種 404 錯誤。

接下來我會在 Visual Studio 2019 中創建一個 ASP.NET Core MVC 項目,用這個項目去展示如何處理 404 錯誤。

然後把 ASP.NET Core MVC 項目跑起來,你會看到應用程序默認的首頁,上面還帶一行 welcome 的歡迎語,如下圖所示:

如何在 ASP.NET Core 中處理 404 錯誤

接下來我們嘗試在瀏覽器中輸入一個不存在的網址,比如說:
http://localhost:6440/welcome
, 這時候 ASP.NET Core MVC 引擎將會訪問這個地址的資源,可想而知,引擎肯定會返回一個 404 錯誤,你也會看到如下錯誤頁,通常情況下這是非常讓人難堪的,對吧。

如何在 ASP.NET Core 中處理 404 錯誤

檢查 ASP.NET Core MVC 的 Response.StatusCode

有幾種方式可以比較完美的處理這種默認的 404 錯誤,一個簡單的方案就是去檢查 response 的 http 狀態碼,一旦發現這個 status = 404,你可以重定向到一個web 中存在的頁面或者一個特定的錯誤頁,下面的代碼展示了,你可以在 Startup.Configure 方法中進行全局判斷,一旦發現404錯誤就導向 home 頁面。


    public class Startup
    {

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.Use(async (context, next) =>
            {
                await next();
                if (context.Response.StatusCode == 404)
                {
                    context.Request.Path = "/Home";
                    await next();
                }
            });
        }
    }

接下來運行web程序,然後鍵入
http://localhost:6440/welcome
,你會發現最終展示了 home 頁面。

下面是 Configure 方法的完整代碼。


        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }
            app.Use(async (context, next) =>
            {
                await next();
                if (context.Response.StatusCode == 404)
                {
                    context.Request.Path = "/Home";
                    await next();
                }
            });
            app.UseStaticFiles();
            app.UseRouting();
            app.UseAuthorization();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
            });
        }

使用 UseStatusCodePages 中間件

第二種可選的解決方案是,採用 ASP.NET Core 中內置的 UseStatusCodePages 中間件,下面的代碼展示了如何在 Startup.Configure 方法中去實現 StatusCodePages 。


public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseStatusCodePages();
            //Other code
        }

現在你可以把程序跑起來然後瀏覽一下這個不存在的資源,下圖展示了這種情況下的輸出結果:

如何在 ASP.NET Core 中處理 404 錯誤

使用 UseStatusCodePagesWithReExecute 中間件

你可以利用
UseStatusCodePagesWithReExecute 中間件來處理 那種 Response 還沒開始構建 就遇到的一些不成功的狀態,有點繞哈,因此這個中間件不會處理 Response status 等於 404 的情況,當 404 發生的時候,這個中間件要做的就是將 request 重定向到另外一個 Action 去處理這個錯誤。

下面的代碼展示了如何使用這個中間件將 request 重定向到另外一個 action 方法。


app.UseStatusCodePagesWithReExecute("/Home/HandleError/{0}");

然後再來看一下被重定向的 Action 方法。


[Route("/Home/HandleError/{code:int}")]
public IActionResult HandleError(int code)
{
   ViewData["ErrorMessage"] = $"Error occurred. The ErrorCode is: {code}";
   return View("~/Views/Shared/HandleError.cshtml");
}

現在我把展示錯誤信息的 HandleError 視圖的創建留給你去實現吧!

最後,你可能想為一些錯誤碼創建一些特定的view,比如說,你可以創建 Home/Error/500.cshtml 或者 Home/Error/404.cshtml 視圖,然後根據 http status code 的值重定向到合適的錯誤頁。

另外一種處理 404 錯誤的方式是使用一個自定義的頁面,然後在頁面上設置一些特定的錯誤代碼,這樣也方便隱藏一些比較重要的信息,比如將 404 改成 服務壓力大,請聯繫管理員 等等,一旦應用程序發生錯誤,你可以將用戶導向你設置的錯誤頁,然後展示你設置的錯誤信息。

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/253369.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-14 02:25
下一篇 2024-12-14 02:27

相關推薦

發表回復

登錄後才能評論