ASP.NET Core MVC中的两种404错误
发布网友
发布时间:2024-10-22 03:02
我来回答
共1个回答
热心网友
时间:2024-11-18 00:55
我们在使用某些系统的时候,如果访问了一个不存在的地址怎么办,比如 52abp.com/airport/fly;或者访问的地址路由和操作方法虽然存在,但是地址参数id不存在,比如 52abp.com/BlogDetails/5这个信息是存在的,但是更改访问 52abp.com/BlogDetails/1...时,则提示博客内容不存在。
在我们的系统中要如何处理呢?本章主要向读者介绍如下内容。在HTTP状态码中,4××和5××分别代表请求错误和服务器在处理请求中的错误或异常状态。
4××系列表示请求错误,代表了客户端可能发生了错误,从而妨碍了服务器的处理。常见的有401状态码、403状态码和404状态码。5××系列表示服务器在处理请求的过程中有错误或者异常状态发生,也可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。常见的有500状态码和503状态码。
404错误信息有两种,我们在之前已经提及了。首先了解第一种:找不到指定ID的信息。当无法通过指定的ID找到学生、产品和客户等信息的时候产生404错误,可以参考HomeController中的Details()的方法,代码如下。
可以通过传递一个ID为99的值来调用HomeController中的Details()方法: http://localhost:13380/home/details/99,查询不到该学生的信息,然后跳转到StudentNotFound视图中。
在Views/Home文件夹中创建一个名为StudentNotFound.cshtml的视图文件,我们使用Bootstrap 4的样式来优化视图,代码如下。在这种情况下,我们知道用户正在尝试转到学生详情视图页面,但因为提供的ID值无效,所以我们需要返回一个带有提示消息的自定义错误页面,提示用户找不到ID以及可以查看学生信息列表的链接,效果如图19.1所示。
图19.1
第二种:请求的URL和路由不匹配。请参考http://localhost:13380/market/food,它也会触发404错误异常信息。在这种情况下,我们无法知道用户到底在访问什么页面,因此无法显示自定义错误页面。我们通常都会返回一个统一的错误页面。
在本节中,我们将学习如何在 ASP.NET Core中统一处理404错误,即Page Not Found错误。在此过程中,我们将学习以下3个中间件,这些组件的作用是处理 ASP.NET Core中的状态码页。
在 ASP.NET Core中,有两种类型的404错误可能发生。以下是Startup类的Configure()方法的代码。读者可能已经知道,这个Configure() 方法用于配置 ASP.NET Core应用程序的HTTP请求处理管道。目前,我们在此HTTP请求处理管道中没有配置任何处理404错误的内容。因此,如果导航到http://localhost:13380/market/food,我们会看到图19.2所示的默认404错误页面。这是因为URL/market/food与应用程序中的所有路由都不匹配,从而引发了错误。
图19.2
为了处理失败的HTTP状态码,比如404,我们可以使用以下3个内置的 ASP.NET Core中间件。以下是关于这些中间件的详细说明和代码实现。
在生产中,我们希望拦截这些访问失败的HTTP状态码,并返回自定义错误视图。为此,我们可以使用UseStatusCodePagesWithRedirects()中间件或UseStatusCodePagesWith-ReExecute()中间件。以下是添加这些中间件到Configure()方法的代码。因为使用了UseStatusCodePagesWithRedirects()中间件,所以如果出现404错误,则会将用户重定向到/Error/404。这里采用了占位符{0} ,它会自动接收HTTP中的状态码。
我们将下面的代码添加到Configure()方法中,如果出现404错误,则会将用户重定向到/Error/404。使用UseStatusCodePagesWithRedirects()中间件,当向http://localhost:13380/market/food发出请求时会触发404状态码,流程如下。通过访问一个不存在的控制器与操作方法,如http://localhost:13380/market/food,发起请求时,由于此URL与我们的应用程序中的任何路由都不匹配,因此会引发404错误。这是因为UseStatusCodePagesWithRedirects()中间件会拦截404状态码,它表示发出重定向到指定的错误路径中(在本例中路径为/Error/404)。
使用UseStatusCodePagesWithRedirects()中间件,当向http://localhost:13380/market/food发出请求时会触发404状态码,流程如下。运行结果如图19.5所示。
图19.5
如果读者正在使用UseStatusCodePagesWithReExecute()中间件,则在Startup中将app.UseStatusCodePagesWithRedirects("/Error/{0}");替换为app. UseStatusCodePages WithReExecute("/Error/{0}")即可。通过访问http://localhost:13380/market/food 发出请求时,同样会触发404状态码,流程如下。它不会从/market/food更改为/Error/404。运行结果如图19.6所示。
图19.6
通过运行对比可以得知,UseStatusCodePagesWithReExecute()中间件不会改变请求地址,而UseStatusCodePagesWithRedirects()中间件则会跳转到ErrorController中进而改变请求地址。我们推荐采用UseStatusCodePagesWithReExecute()中间件,保留错误的URL信息,便于记录到日志文件中。
在本节中,我们学习了如何在 ASP.NET Core中实现全局异常处理程序,并呈现任意非正常请求。在以下Details()操作方法中,我们故意使用throw关键字抛出异常。访问http://localhost:13380/Home/Details/2,结果如图19.8所示。可以看到返回的状态码是500,因为500错误是来自服务器的内部错误。
在以下Details()操作方法中,我们故意使用throw关键字抛出异常。访问http://localhost:13380/Home/Details/2,结果如图19.8所示。可以看到返回的状态码是500,因为500错误是来自服务器的内部错误。在本节中,我们将学习如何在 ASP.NET Core中实现全局异常处理程序,并呈现任意非正常请求。在以下Details()操作方法中,我们故意使用throw关键字抛出异常。访问http://localhost:13380/Home/Details/2,结果如图19.8所示。可以看到返回的状态码是500,因为500错误是来自服务器的内部错误。
为了处理非开发环境中的异常,我们使用UseExceptionHandler()方法将异常处理中间件添加到请求处理管道。遇到异常的时候,异常处理中间件会跳转到ErrorController中,我们需要打开Startup类的Configure()方法。修改ErrorController代码,它会搜索异常详细信息并返回到指定的自定义错误视图。在生产中,不会在错误视图上显示异常详细信息。我们可以将它们记录到数据库表、文件和事件查看器等,以便开发人员查看它们,并在需要时提供代码修复。我们将在稍后的章节中讨论日志记录。
在默认情况下,如果在生产等非开发环境中存在未处理的异常,则会看到如图19.10所示的默认页面。在本地开发计算机上模拟生产环境,应修改应用程序中的环境变量。打开launchSettings.json文件将其中的ASPNETCORE_ENVIRONMENT变量设置为Production,表示当前开发环境已经为Production(生产环境)。在生产中,不会在错误视图上显示异常详细信息。我们可以将它们记录到数据库表、文件和事件查看器等,以便开发人员查看它们,并在需要时提供代码修复。我们将在稍后的章节中讨论日志记录。
在本章我们为系统实现了用户友好的错误页面信息以及对全局异常的处理,讲解了为实现这些功能都提供了哪些中间件,以及中间件的特点和加载顺序。在接下来的章节中,我们将会实现将异常信息记录到文件中,这样便于开发人员分析这些错误信息,以优化系统。
本章内容摘自《深入浅出 ASP.NET Core》。本书是一本系统地介绍 ASP.NET Core、Entity Framework Core以及 ASP.NET Core Identity框架技术的入门图书,旨在帮助读者循序渐进地了解和掌握 ASP.NET Core。本书使用 ASP.NET Core从零开始搭建一个实际的项目。从基本的控制台应用程序开始,介绍 ASP.NET Core基本的启动流程,涵盖 ASP.NET Core框架中各个技术的实际应用。同时,本书也会介绍一些 ASP.NET Core的高级概念。在本书中,我们会开发一个学校管理系统,其中包含清晰的操作步骤和大量的实际代码,以帮助读者学以致用,将 ASP.NET Core的知识运用到实际的项目开发当中,最后我们会将开发的项目部署到生产环境中。通过阅读本书,读者将掌握使用 ASP.NET Core开发Web应用程序的方法,并能够在对新项目进行技术选型时做出战略决策。
本书适合有一定C# 编程经验和HTML、JavaScript基础,并对 ASP.NET Core感兴趣的读者阅读,也可以作为高等院校相关专业的教学用书和培训学校的教材。