淺談ASP.NETCore統(tǒng)一處理404錯(cuò)誤都有哪些方式
當(dāng)未找到網(wǎng)頁(yè)并且應(yīng)用程序返回 404 錯(cuò)誤時(shí),ASP.NET Core MVC 僅呈現(xiàn)通用瀏覽器錯(cuò)誤頁(yè)面,如下圖所示
這不是很優(yōu)雅,是嗎?我們平時(shí)看到的404頁(yè)面一般是這樣的
還有這樣的
試了下京東,地址不存在的時(shí)候是會(huì)重定向到首頁(yè)
下面就來(lái)演示下ASP.NET Core中如何實(shí)現(xiàn)這種自定義的404頁(yè)面處理。
新建項(xiàng)目 ASP.NET Core MVC(WebApi處理方式也一樣)
新建好的項(xiàng)目直接運(yùn)行的效果
隨便輸入一個(gè)地址 /test404
當(dāng)未找到網(wǎng)頁(yè)并且應(yīng)用程序返回 404 錯(cuò)誤時(shí),ASP.NET Core MVC 僅呈現(xiàn)通用瀏覽器錯(cuò)誤頁(yè)面,如下圖所示
方式一
FallbackEndpointRouteBuilderExtensions.MapFallback
這是個(gè)什么東西?
意思大概是說(shuō)這是注冊(cè)一個(gè)優(yōu)先級(jí)最低的通配路由,來(lái)匹配所有路由,那就來(lái)試試效果吧。
// Program.cs app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.MapFallback(async (ctx) => { ctx.Response.Body.Write(Encoding.UTF8.GetBytes("404 from Fallback")); }); app.Run();
試試效果如下
方式二 自定義通配路由
在HomeController
添加一個(gè)Action如下
// HomeController.cs [Route("{*url}", Order = 9999)] public IActionResult Page404() { return View(); }
添加對(duì)應(yīng)的View頁(yè)面如下
// Page404.cshtml @{ ViewData["Title"] = "404"; } <div>404 for {*url}</div>
上面兩種方式雖然能夠正常處理404錯(cuò)誤頁(yè),但是在程序內(nèi)部拋出的404錯(cuò)誤卻無(wú)法進(jìn)行攔截
添加一個(gè)測(cè)試Action如下
[Route("/test404")] public IActionResult test404() { // 一些業(yè)務(wù)處理,最終返回404 // return NotFound(); return StatusCode(404); }
你看,這種404場(chǎng)景,上述方式?jīng)]能進(jìn)行攔截處理。
方式三
自定義Middleware攔截
代碼如下,關(guān)于Middleware如何使用這里不做介紹
app.Use((context, next) => { var res = next(context); if (context.Response.StatusCode == 404) { context.Response.StatusCode = 200; context.Response.Body.Write(Encoding.UTF8.GetBytes("404 from Middleware")); } return res; });
把方式一和方式二的代碼注釋掉,運(yùn)行測(cè)試效果如下
不存在的地址
存在的地址,但是業(yè)務(wù)上返回404
方式四
UseStatusCodePagesWithReExecute
注釋上個(gè)方法的代碼
app.UseStatusCodePagesWithReExecute("/error/{0}");
// HomeController.cs [Route("test401")] public IActionResult test401() { return StatusCode(401); }
public class ErrorController : Controller { [Route("error/404", Order = 9)] public IActionResult Error404() { ViewBag.code = 404; return View(); } [Route("error/{code:int}", Order = 1)] public IActionResult Error(int code) { ViewBag.code = code; switch (code) { case 404: ViewBag.msg = "對(duì)不起,請(qǐng)求的資源不存在。"; break; case 401: ViewBag.msg = "對(duì)不起,您無(wú)權(quán)限訪問(wèn)此頁(yè)面。"; break; default: ViewBag.msg = "服務(wù)異常,請(qǐng)稍后重試!"; break; } return View("Error404"); } }
// Error404.cshtml @{ } <div>@ViewBag.code : @ViewBag.msg</div>
測(cè)試效果
完美!?。?!
方式五 web.config <customErrors> 節(jié)點(diǎn)中配置ASP.NET管道處理404錯(cuò)誤
這是以前framwork時(shí)代的iis配置方式,不推薦使用了,也不進(jìn)行測(cè)試了。
總結(jié)
個(gè)人認(rèn)為方式三、四推薦使用,四更加優(yōu)雅,三是最靈活的,還有沒(méi)有其他方式進(jìn)行攔截統(tǒng)一處理404錯(cuò)誤呢,歡迎補(bǔ)充。
本文源碼已上傳 github
到此這篇關(guān)于淺談ASP.NETCore統(tǒng)一處理404錯(cuò)誤都有哪些方式的文章就介紹到這了,更多相關(guān)ASP.NETCore 404錯(cuò)誤內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
asp.net下URL網(wǎng)址重寫(xiě)成.html格式、RSS、OPML的知識(shí)總結(jié)
asp.net下URL網(wǎng)址重寫(xiě)成.html格式、RSS、OPML的知識(shí)總結(jié)...2007-09-09asp.net core 2.0 webapi集成signalr(實(shí)例講解)
下面小編就為大家分享一篇asp.net core 2.0 webapi集成signalr的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-11-11ASP.Net Post方式獲取數(shù)據(jù)流的一種簡(jiǎn)單寫(xiě)法
這篇文章主要介紹了ASP.Net Post方式獲取數(shù)據(jù)流的一種簡(jiǎn)單寫(xiě)法,本文直接給出代碼實(shí)例,需要的朋友可以參考下2015-05-05asp.net 計(jì)算字符串中各個(gè)字符串出現(xiàn)的次數(shù)
比如一個(gè)字符串"a,b,a,c,b,b,d",現(xiàn)在我們要統(tǒng)計(jì)每個(gè)字符串出現(xiàn)次數(shù)。解決這個(gè)問(wèn)題,我們可以使用泛型集合 Dictionary(TKey,TValue)。它有一個(gè)key值用來(lái)存儲(chǔ)字符串和一個(gè)value值,用來(lái)存儲(chǔ)字符串出現(xiàn)的次數(shù)2012-05-05使用HttpClient增刪改查ASP.NET Web API服務(wù)
這篇文章介紹了使用HttpClient增刪改查ASP.NET Web API服務(wù)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-10-10輕量級(jí)ORM框架Dapper應(yīng)用之返回多個(gè)結(jié)果集
這篇文章介紹了使用Dapper返回多個(gè)結(jié)果集的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03asp.net及javascript判斷是否手機(jī)訪問(wèn)的方法
這篇文章主要介紹了asp.net及javascript判斷是否手機(jī)訪問(wèn)的方法,結(jié)合實(shí)例形式對(duì)比分析了asp.net及javascript實(shí)現(xiàn)判斷訪問(wèn)端類型的相關(guān)技巧,需要的朋友可以參考下2016-06-06ASP.NET WebAPI2復(fù)雜請(qǐng)求跨域設(shè)置的方法介紹
這篇文章主要給大家介紹了關(guān)于ASP.NET WebAPI2復(fù)雜請(qǐng)求跨域設(shè)置的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用ASP.NET具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07MVC 5限制所有HTTP請(qǐng)求必須是POST方式
這篇文章主要為大家詳細(xì)介紹了MVC 5限制所有HTTP請(qǐng)求必須是POST方式的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06