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

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

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

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

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

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

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

檢查 ASP.NET Core MVC 的 Response.StatusCode

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

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 頁面。async

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

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
        }

如今你能夠把程序跑起來而後瀏覽一下這個不存在的資源,下圖展現了這種狀況下的輸出結果:ui

使用 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 改爲 服務壓力大,請聯繫管理員 等等,一旦應用程序發生錯誤,你能夠將用戶導向你設置的錯誤頁,而後展現你設置的錯誤信息。

相關文章
相關標籤/搜索