问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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感兴趣的读者阅读,也可以作为高等院校相关专业的教学用书和培训学校的教材。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
这种情况需要准备什么样的证据才能保证维权成功,关于个人知识产权方面... 侵犯著作权罪成立的条件是什么 网站被抄袭,怎么办?官网网页内容抄袭引发的法律问题 版权申请哪家性价比高? 著作权侵权损害如何赔偿 瓷砖划痕怎么处理方法 地板砖划痕怎么去除十种方法 关于梦幻西游转区的一些问题。懂的进。 茶叶泡水发苦的原因茶叶泡水发苦是什么原因 ...那又怎么样?从化学角度讲不也是那种分子起的作 有关描写春天的四字词语有哪些 赛尔计划盖亚刻印推荐 盖亚冥想曲盖亚经历 ...要有优美片段和这段话的评析,好词好句。还有读后感受。 世界十大巧克力工厂 我买的小鸭洗衣机才洗了两次衣服,洗桶工作时声音特别大。怎么回事 k817次列车2月3日车票啥时预售 想做k817去成都 去哪网查的有这趟车经过 去火车站买票却没有这趟车... 12306官网,请问明天k817火车正常运行吗? 9月28号的k817火车怎么没有? 手机屏幕分辨率已追上电脑了吗? 潍坊潍艺装饰怎么样 潍坊维艺装饰怎么样 潍坊万泰装饰有限公司公司荣誉 潍坊尚易装饰怎么样 潍坊万泰装饰企业核心优势 十堰田字塑料托盘 洛阳到成都坐火车要多久能到?都有那些车次? 急急急!北京站到北京南站最方便的乘车方式(公交,地铁),谢谢。 仔猪水肿病临诊症状 ...避寒”旅游地,一个比一个暖和,你去过哪个呢? 谁有超人出场的背景音乐!就是那个 当当!当当当当当!当当当当当!当当当 ... 如何稀释清漆 一个手机上面的轻音乐,好像是 当当当当 当当当当 当当当当当。有点大海... ...大概是:当当当当当当当,当当当当当当,当!当!挺流行的钢琴曲_百度... ...个音乐大概旋律是这样的 当当当当当当 当当当当当当 当当当当... 能不能帮我分析一下这个命盘 尤其是夫妻宫上的?谢谢!!! 读红楼梦学到了什么,问题是感悟随笔,不要太多在线等 读书笔记是从一本书还是一篇文章中摘抄呀 刑事诉讼法的当事人有哪些法律上如何认定 刑事诉讼中当事人有哪些权利 ...害人精”表面上指的是___,实际上指的是___,原因是什么呢?_百度知 ... 哪些人是刑事诉讼法规定的当事人 刑事附带民事诉讼原告人的权利是什么 诉讼人是原告还是被告,什么是当事人原告被告和第 ...数除以2余1,除以4余1,除以5余4,除以6余3,除以8余1,除以1,3,7,9都... 一个数除以2余1,除以3余1,除以4余1,除以5余1,除以6余1,这个数是多少... ...除以3余1,除以4余3,除以5余4,除以6余1,除以7余1,这个数最小是几... ...除以2余1,能被3整除,除以4余1,除以6余3,除以8余1,能被7整除_百度知 ... ...除以3刚好正除,除以4余1,除以5余4,除以6余3,除以7正好