在 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 == )
{
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 = ;
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?404:500)}.html";
return new PhysicalFileResult(filePath, new MediaTypeHeaderValue("text/html"));
}
}

最新文章

  1. 给定时器settimeout、setInterval调用传递参数
  2. 手把手教你在VirtualBox中与主机共享文件夹
  3. yii cookie ,session 操作
  4. 快速排序模板qsort(转载)
  5. MySQL —— 程序连接时的驱动名称和URL
  6. Object类型
  7. AngularJS指令的作用域
  8. 如何在一个Eclipse同时启动两个Tomcat
  9. win10 运行sqlplus报错“SP2-1503: 无法初始化 Oracle 调用界面”
  10. thinkphp5URL和路由
  11. JS正则表达式的基础用法
  12. spring中获取dao或对象中方法的实例化对象
  13. Linux系统Vi/Vim编辑器的简单介绍、安装/卸载、常用命令
  14. keras可视化pydot graphviz问题
  15. 如何给webview页面自定义404页面
  16. jenkins gradle 实践总结
  17. 自己写的一个Vue
  18. iOS刻度尺换算之1mm等于多少像素理解
  19. linux给当前用户添加环境变量
  20. Ucloud云主机无法yum安装处理办法

热门文章

  1. Swagger(webapi自动生成接口说明文档)
  2. wifi的country code
  3. 爬虫requests模块 2
  4. SQL Server客户端请求
  5. mysql 字符串 日期互转
  6. Dev Cpp 输出中文字符问题
  7. cookies插件,记住cookies
  8. JavaScript(三) 正则表达式 以及实现的功能
  9. 切图时图片的选择:JPG、PNG、GIF的区别
  10. sqlite like 通配符 ,匹配区分大小写(默认不区分大小写)