前言
相信每位程序员们应该都知道在 ASP.NET Core 中,默认情况下当发生500或404错误时,只返回http状态码,不返回任何内容,页面一片空白。
如果在 Startup.cs 的 Configure() 中加上 app.UseStatusCodePages();
,500错误时依然是一片空白(不知为何对500错误不起作用),404错误时有所改观,页面会显示下面的文字:
Status Code: 404; Not Found
如果我们想实现不管500还是404错误都显示自己定制的友好错误页面,那该怎么办呢?
对于500错误,我们可以用 app.UseExceptionHandler()
进行截获;
对于404错误,我们可以用 app.UseStatusCodePages()
的增强版 app.UseStatusCodePagesWithReExecute()
进行截获;
然后转交给相应的URL进行处理。
app.UseExceptionHandler("/errors/500"); app.UseStatusCodePagesWithReExecute("/errors/{0}");
URL 路由到 MVC Controller 中显示友好错误页面。
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"); } }
【更新】
后来发现一个问题,当出现底层异常时,自定义错误页面不能显示,还是一片空白,比如下面的异常:
System.DllNotFoundException: Unable to load DLL 'System.Security.Cryptography.Native.Apple': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
这时想到用 MVC 显示自定义错误页面的局限,如果发生的异常导致 MVC 本身不能正常工作,自定义错误页面就无法显示。
于是针对这个问题进行了改进,针对500错误直接用静态文件的方式进行响应,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}");
为了重用自定义错误页面,MVC Controller 中已进行了修改:
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"; return new PhysicalFileResult(filePath, new MediaTypeHeaderValue("text/html")); } }
总结
以上就是关于ASP.NET Core中显示自定义错误页面的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。