在ASP.NET Core中顯示自定義的錯(cuò)誤頁面
前言
相信每位程序員們應(yīng)該都知道在 ASP.NET Core 中,默認(rèn)情況下當(dāng)發(fā)生500或404錯(cuò)誤時(shí),只返回http狀態(tài)碼,不返回任何內(nèi)容,頁面一片空白。
如果在 Startup.cs 的 Configure() 中加上 app.UseStatusCodePages(); ,500錯(cuò)誤時(shí)依然是一片空白(不知為何對(duì)500錯(cuò)誤不起作用),404錯(cuò)誤時(shí)有所改觀,頁面會(huì)顯示下面的文字:
Status Code: 404; Not Found
如果我們想實(shí)現(xiàn)不管500還是404錯(cuò)誤都顯示自己定制的友好錯(cuò)誤頁面,那該怎么辦呢?
對(duì)于500錯(cuò)誤,我們可以用 app.UseExceptionHandler() 進(jìn)行截獲;
對(duì)于404錯(cuò)誤,我們可以用 app.UseStatusCodePages() 的增強(qiáng)版 app.UseStatusCodePagesWithReExecute() 進(jìn)行截獲;
然后轉(zhuǎn)交給相應(yīng)的URL進(jìn)行處理。
app.UseExceptionHandler("/errors/500");
app.UseStatusCodePagesWithReExecute("/errors/{0}");
URL 路由到 MVC Controller 中顯示友好錯(cuò)誤頁面。
public class ErrorsController : Controller
{
[Route("errors/{statusCode}")]
public IActionResult CustomError(int statusCode)
{
if(statusCode == 404)
{
return View("~/Views/Errors/404.cshtml");
}
return View("~/Views/Errors/500.cshtml");
}
}
【更新】
后來發(fā)現(xiàn)一個(gè)問題,當(dāng)出現(xiàn)底層異常時(shí),自定義錯(cuò)誤頁面不能顯示,還是一片空白,比如下面的異常:
System.DllNotFoundException: Unable to load DLL 'System.Security.Cryptography.Native.Apple': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
這時(shí)想到用 MVC 顯示自定義錯(cuò)誤頁面的局限,如果發(fā)生的異常導(dǎo)致 MVC 本身不能正常工作,自定義錯(cuò)誤頁面就無法顯示。
于是針對(duì)這個(gè)問題進(jìn)行了改進(jìn),針對(duì)500錯(cuò)誤直接用靜態(tài)文件的方式進(jìn)行響應(yīng),Startup.cs 的 Configure() 中的代碼如下:
app.UseExceptionHandler(errorApp =>
{
errorApp.Run(async context =>
{
context.Response.StatusCode = 500;
if (context.Request.Headers["X-Requested-With"] != "XMLHttpRequest")
{
context.Response.ContentType = "text/html";
await context.Response.SendFileAsync($@"{env.WebRootPath}/errors/500.html");
}
});
});
app.UseStatusCodePagesWithReExecute("/errors/{0}");
為了重用自定義錯(cuò)誤頁面,MVC Controller 中已進(jìn)行了修改:
public class ErrorsController : Controller
{
private IHostingEnvironment _env;
public ErrorsController(IHostingEnvironment env)
{
_env = env;
}
[Route("errors/{statusCode}")]
public IActionResult CustomError(int statusCode)
{
var filePath = $"{_env.WebRootPath}/errors/{(statusCode == 404?404:500)}.html";
return new PhysicalFileResult(filePath, new MediaTypeHeaderValue("text/html"));
}
}
總結(jié)
以上就是關(guān)于ASP.NET Core中顯示自定義錯(cuò)誤頁面的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
相關(guān)文章
基于ASP.NET實(shí)現(xiàn)日期轉(zhuǎn)為大寫的漢字
在寫代碼時(shí)遇到一個(gè)需要將日期轉(zhuǎn)換為中文大寫日期的問題,網(wǎng)上找了找,示例不是很多,只有javascript代碼的,下面整理下在ASP.NET中怎么實(shí)現(xiàn)。2016-08-08
在.NET Web API設(shè)置響應(yīng)輸出Json數(shù)據(jù)格式常用的兩種方式詳解
在ASP.NET Core Web API中設(shè)置響應(yīng)輸出Json數(shù)據(jù)格式常用以下兩種方式:可以通過添加System.Text.Json或Newtonsoft.JsonJSON序列化和反序列化庫在應(yīng)用程序中全局設(shè)置接口響應(yīng)的Json數(shù)據(jù)格式,本文示例使用的是新的Minimal API模式,感興趣的朋友跟隨小編一起看看吧2024-07-07
集合類List與Dictonary實(shí)例練習(xí)
本文將詳細(xì)介紹下List<>泛型集合/Dictonary<>字典/泛型集合練習(xí) /中日期轉(zhuǎn)換提取為方法以及泛型集合練習(xí)之翻譯軟件,感興趣的你可不要錯(cuò)過了哈2013-02-02
ASP.NET?Core?使用SignalR推送服務(wù)器日志的過程記錄
這篇文章主要介紹了ASP.NET?Core?使用SignalR推送服務(wù)器日志的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-01-01
3分鐘快速學(xué)會(huì)在ASP.NET Core MVC中如何使用Cookie
這篇文章主要給大家介紹了關(guān)于如何通過3分鐘快速學(xué)會(huì)在ASP.NET Core MVC中使用Cookie的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用ASP.NET具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
asp.net javascript 文件無刷新上傳實(shí)例代碼
最近在寫C# .net代碼的時(shí)候,遇到一個(gè)上傳刷新的問題。2009-06-06
asp.net下中文驗(yàn)證碼,免費(fèi)開源代碼
asp.net下中文驗(yàn)證碼,免費(fèi)開源代碼...2007-04-04

