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
有幾種方式能夠比較完美的處理這種默認的 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?}"); }); }
第二種可選的解決方案是,採用 ASP.NET Core 中內置的 UseStatusCodePages 中間件,下面的代碼展現瞭如何在 Startup.Configure 方法中去實現 StatusCodePages 。性能
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseStatusCodePages(); //Other code }
如今你能夠把程序跑起來而後瀏覽一下這個不存在的資源,下圖展現了這種狀況下的輸出結果:ui
你能夠利用 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 改爲 服務壓力大,請聯繫管理員 等等,一旦應用程序發生錯誤,你能夠將用戶導向你設置的錯誤頁,而後展現你設置的錯誤信息。