当前位置: 首页 > 编程笔记 >

在ASP.NET Core中显示自定义的错误页面

邓鸿彩
2023-03-14
本文向大家介绍在ASP.NET Core中显示自定义的错误页面,包括了在ASP.NET Core中显示自定义的错误页面的使用技巧和注意事项,需要的朋友参考一下

前言

相信每位程序员们应该都知道在 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?404:500)}.html";
  return new PhysicalFileResult(filePath, new MediaTypeHeaderValue("text/html"));
 }  
}

总结

以上就是关于ASP.NET Core中显示自定义错误页面的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

 类似资料:
  • 我正在进行Spring Security集成,我的内置安全页面的应用程序运行良好。但是对于自定义登录页面,它给出了错误 以下是我的代码供参考 在spring-security.xml 在login.jsp 在控制器中: 当我使用内置表单pulgin运行项目时,url是 登录后,如果我手动点击网址 它向我显示了登录页面,但我没有看到。如果这次显示了该页面,那么为什么它没有在自定义配置中显示。请帮帮忙

  • 我正在做一个spring boot项目,使用OPENAPI作为api文档的工具。 我试图用直观的输入(page-pageSize-sort)覆盖UI中可分页json对象的显示 这是可行的,但是参数页面、页面大小和排序被添加到所有方法中。我如何才能使这只适用于需要可分页的方法?

  • Flask 自带了很顺手的 abort() 函数用于以一个 HTTP 失败代码 中断一个请求,他也会提供一个非常简单的错误页面,用于提供一些基础的描述。 这个页面太朴素了以至于缺乏一点灵气。 依赖于错误代码的不同,用户看到某个错误的可能性大小也不同。 通常的错误代码 下面列出了一些用户经常遇到的错误代码,即使在这个应用准确无误的情况下也可能发生: 404 Not Found 经典的“哎呦,您输入的

  • 本文向大家介绍Laravel5.1自定义500错误页面示例,包括了Laravel5.1自定义500错误页面示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Laravel5.1自定义500错误页面的方法。分享给大家供大家参考,具体如下: Laravel 5.1中500错误是程序错误,程序错误一定是系统自带的500错误,可以通过以下步骤简单实现自定义500错误页面。 编辑PHP文件app/

  • 问题内容: 假设我们有: 尝试输入错误的URL时,用户会看到一个普通的“找不到404页”。如何为这种情况返回自定义页面? 有关大猩猩/木糖的更新 对于使用纯net / http软件包的用户,可以接受答案。 如果您使用大猩猩/多路复用器,则应使用以下内容: 并根据需要实施。 问题答案: 我通常这样做: 在这里,我将代码简化为仅显示自定义404,但实际上使用此设置可以做更多的事情:我使用来处理所有HT

  • 我试图在我的Web应用程序中创建自定义错误页面,而不是白标签页面。正如我所知,在Spring Boot中,我所需要做的就是在resources/static/templates路径下添加一个error.html文件,所以我做到了(我使用的是Thymeleaf)。但现在它显示的不是白标签页面,而是tomcat错误页面。我还试图补充: 到属性文件中,但结果是相同的-容器错误页。做这件事的正确方法是什么