首頁>技術>

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

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

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

接下來我們嘗試在瀏覽器中輸入一個不存在的網址,比如說:http://localhost:6440/welcome, 這時候 ASP.NET Core MVC 引擎將會訪問這個地址的資源,可想而知,引擎肯定會返回一個 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        }

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

使用 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 的值重定向到合適的錯誤頁。

24
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 嵌入式必備之Git的使用