淺談ASP.NETCore統(tǒng)一處理404錯誤都有哪些方式
當(dāng)未找到網(wǎng)頁并且應(yīng)用程序返回 404 錯誤時,ASP.NET Core MVC 僅呈現(xiàn)通用瀏覽器錯誤頁面,如下圖所示

這不是很優(yōu)雅,是嗎?我們平時看到的404頁面一般是這樣的

還有這樣的

試了下京東,地址不存在的時候是會重定向到首頁
下面就來演示下ASP.NET Core中如何實現(xiàn)這種自定義的404頁面處理。
新建項目 ASP.NET Core MVC(WebApi處理方式也一樣)

新建好的項目直接運(yùn)行的效果

隨便輸入一個地址 /test404
當(dāng)未找到網(wǎng)頁并且應(yīng)用程序返回 404 錯誤時,ASP.NET Core MVC 僅呈現(xiàn)通用瀏覽器錯誤頁面,如下圖所示

方式一
FallbackEndpointRouteBuilderExtensions.MapFallback
這是個什么東西?

意思大概是說這是注冊一個優(yōu)先級最低的通配路由,來匹配所有路由,那就來試試效果吧。
// 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添加一個Action如下
// HomeController.cs
[Route("{*url}", Order = 9999)]
public IActionResult Page404()
{
return View();
}
添加對應(yīng)的View頁面如下
// Page404.cshtml
@{
ViewData["Title"] = "404";
}
<div>404 for {*url}</div>

上面兩種方式雖然能夠正常處理404錯誤頁,但是在程序內(nèi)部拋出的404錯誤卻無法進(jìn)行攔截
添加一個測試Action如下
[Route("/test404")]
public IActionResult test404()
{
// 一些業(yè)務(wù)處理,最終返回404
// return NotFound();
return StatusCode(404);
}
你看,這種404場景,上述方式?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)行測試效果如下
不存在的地址

存在的地址,但是業(yè)務(wù)上返回404

方式四
UseStatusCodePagesWithReExecute
注釋上個方法的代碼

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 = "對不起,請求的資源不存在。";
break;
case 401:
ViewBag.msg = "對不起,您無權(quán)限訪問此頁面。";
break;
default:
ViewBag.msg = "服務(wù)異常,請稍后重試!";
break;
}
return View("Error404");
}
}
// Error404.cshtml
@{
}
<div>@ViewBag.code : @ViewBag.msg</div>
測試效果


完美!?。。?/p>
方式五 web.config <customErrors> 節(jié)點(diǎn)中配置ASP.NET管道處理404錯誤
這是以前framwork時代的iis配置方式,不推薦使用了,也不進(jìn)行測試了。
總結(jié)
個人認(rèn)為方式三、四推薦使用,四更加優(yōu)雅,三是最靈活的,還有沒有其他方式進(jìn)行攔截統(tǒng)一處理404錯誤呢,歡迎補(bǔ)充。
本文源碼已上傳 github
到此這篇關(guān)于淺談ASP.NETCore統(tǒng)一處理404錯誤都有哪些方式的文章就介紹到這了,更多相關(guān)ASP.NETCore 404錯誤內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
.net實現(xiàn)網(wǎng)站用戶登錄認(rèn)證
本文給大家介紹的是.net實現(xiàn)網(wǎng)站用戶登錄認(rèn)證的方法和實例,都非常的簡單實用,需要的小伙伴可以參考下。2015-11-11
詳解ASP.NET Core 網(wǎng)站發(fā)布到Linux服務(wù)器
本篇文章主要介紹了ASP.NET Core 網(wǎng)站發(fā)布到Linux服務(wù)器 。具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-04-04
asp.net 網(wǎng)頁動態(tài)查詢條件的實現(xiàn)
最近有一個需求,會在 mongodb 中插入各種類型的數(shù)據(jù),算是記錄業(yè)務(wù)日志的數(shù)據(jù)庫吧。因為業(yè)務(wù)對象類型都不同,所以插入的數(shù)據(jù)格式也完全不同2012-10-10

