ASP.NET Core 处理 404 Not Found

问题

在没有修改任何配置的情况下,这是用户使用 Chrome 访问不存在的URL时会看到的内容:

幸运的是,处理错误状态代码非常简单,我们将在下面介绍三种技术。

解决方案

在以前的ASP.NET MVC版本中,主要在 web.config 中处理404错误的。

您可能记得在 <customErrors> 节点中配置ASP.NET管道处理404错误,以及在低版本的IIS中通过 <httpErrors> 节点处理 404错误。好像有点混乱。

在.Net Core中,情况就不同了,没有必要使用XML配置(尽管如果您是通过IIS代理,您仍然可以在web.config中使用 httpErrors,并且您真的想这样吗:-))。

在处理 not-found 错误时,我们需要处理两种不同的情况。

URL与任何路由不匹配的情况。在这种情况下,如果我们无法确定用户正在访问什么,我们需要返回一个通用的未找到的页面。有两种常见的处理方法,但首先我们将讨论第二种情况。URL与路由匹配的情况,但是一个或多个参数无效,我们可以用自定义视图来解决这个问题。

自定义视图

这种情况的一个例子是具有无效或过期ID的产品页面。在这里,我们知道用户正在查看产品,而不是返回通用错误,我们可以更友好的页面,返回自定义未找到产品的的页面。这仍然需要返回404状态代码,但是使用不通用的页面,同时也可以向用户显示类似或受欢迎的产品。

处理这些情况是非常琐碎,我们需要做的是在返回我们的自定义视图之前设置状态代码:

    public async Task<IActionResult> GetProduct(int id)    {     
      var viewModel = await _db.Get<Product,GetProductViewModel>(id);    if (viewModel == null){Response.StatusCode = 404;        
         return View("ProductNotFound");}    return View(viewModel);}

当然,您可能更喜欢将其包装成自定义ActionResult:

    public class NotFoundViewResult : ViewResult{        public NotFoundViewResult(string viewName)            {ViewName = viewName;StatusCode = (int)HttpStatusCode.NotFound;}}

这简化了我们的Action:

    public async Task<IActionResult> GetProduct(int id)    {      
     var viewModel = await _db.Get<Product,GetProductViewModel>(id);    if (viewModel == null){          
       return new NotFoundViewResult("ProductNotFound");}    return View(viewModel);}

这个简单的技术涵盖了特定的404页,现在来看看通用的404错误,我们无法弄清楚用户想要查看的内容。

通配路由

在先前版本的MVC,创建一个通配符路由来处理,在.NET Core中,也可以使用相同的方式。这个方式是,您有一个通配符路由,它会接收任何其它路由尚未处理的URL。使用特性路由,方式如下:

    [Route("{*url}", Order = 999)]   
   public IActionResult CatchAll()    {Response.StatusCode = 404;    
      return View();}

重要的是指定顺序,以确保其它路由优先。

一个通配符路由的方式非常不错,但它不是.NET Core中的首选。虽然全部路由将处理404,但下一个方式将处理任何非成功状态代码,以便您可以执行以下Action(可能在生产中的Action过滤器中):

    public async Task<IActionResult> GetProduct(int id)    {...    if (RequiresThrottling()){            return new StatusCodeResult(429)}    if (!HasPermission(id)){            return Forbid();}...}

StatusCodePagesWithReExecute方法 中件间

UseStatusCodePagesWithReExecute使用了一个非常聪明的中间件(StatusCodePagesMiddleware),在未输出响应前,它能处理非成功状态代码。这意味着如果您使用上面详细描述的自定义视图技术,则404状态代码将不会被中间件处理(这正是我们想要的)。

当从内部中间件组件返回错误代码(如404)时,UseStatusCodePagesWithReExecute允许您执行另一个控制器Action来处理状态代码。

您可以在startup.cs中使用一行代码将其添加到管道中:

    app.UseStatusCodePagesWithReExecute("/error/{0}");...app.UseMvc();

中间件定义的顺序很重要,您需要确保在可能返回错误代码的任何中间件(如MVC中间件)之前注册StatusCodeWithReExecute。

您可以指定一个固定路径来执行或使用状态代码值的占位符,如上所述。

您还可以指向静态页面(假设您已经具有StaticFileMiddleware中间件)和控制器Action。

在这个例子中,我们有一个单独的Action处理404。任何其它非成功状态代码,使用 Error Action。

    [Route("error/404")]    
   public IActionResult Error404()    {    
       return View();}[Route("error/{code:int}")]  
   public IActionResult Error(int code)    {      
    // handle different codes or just return the default error viewreturn View();}

显然,您可以根据您的需要量身定制。例如,如果您正在使用上一节所示的请求限制,那么您可以返回一个解释为什么请求失败的429页面。

总结

处理404页面的具体问题最好用自定义视图来处理,并设置状态代码(直接或通过自定义操作结果)。

通过使用StatusCodePagesMiddleware中间件,可以非常容易地处理通用404错误(或实际上是任何非成功状态代码)。一般来说,这两种技术是在ASP.NET Core中处理非成功HTTP状态代码的首选方法。

原文:《Handling 404 Not Found in Asp.Net Core》https://www.devtrends.co.uk/blog/handling-404-not-found-in-asp.net-core
翻译:Sweet Tang
本文地址:http://www.cnblogs.com/tdfblog/p/handling-404-not-found-in-asp-net-core.html


原文地址: http://www.cnblogs.com/tdfblog/p/handling-404-not-found-in-asp-net-core.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323237.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

搞定所有的跨域请求问题

转载自 搞定所有的跨域请求问题 网上各种跨域教程&#xff0c;各种实践&#xff0c;各种问答&#xff0c;除了简单的 jsonp 以外&#xff0c;很多说 CORS 的都是行不通的&#xff0c;老是缺那么一两个关键的配置。本文只想解决问题&#xff0c;所有的代码经过亲自实践。 本文…

nssl1269-射击【贪心,堆】

正题 题目大意 有n个东西&#xff0c;东西必须在aisa_i\ sai​ s前破坏&#xff0c;破坏后可以获得wiw_iwi​价值&#xff0c;求最大价值。 解题思路 我们可以将时间从大到小排序&#xff0c;然后用堆&#xff0c;每次处理价值最大的就好了。 code #include<cstdio> #…

搭建一个二次元博客

小叙&#xff1a; 因为前段日子尝试过自己搭建网站&#xff0c;也在b站发了视频&#xff0c;奈何技术太菜&#xff0c;被喷的严重。所以决定重构一下网站&#xff0c;改成一个个人博客。这里非常感谢小游提供的主题&#xff0c;感谢他对这么优秀的主题的推广。 如果你正好也要…

jar包天天见,可是你知道它的运行机制吗

转载自 jar包天天见&#xff0c;可是你知道它的运行机制吗 今天介绍两个大家每天都在用但是却很少去了解它的知识点&#xff1a;spi 和 jar 运行机制&#xff0c;废话不多说&#xff0c;开始正题。 spi spi 是 Java 提供的一套用来被第三方实现或者扩展的 API &#xff0c;…

nssl1270-创世纪【树形dp,基环树】

正题 题目大意 每个物品有一个可以限制的物品&#xff0c;要求一个集合内所有的物品都有一个不在集合内物品限制。求这个集合可以保护的最多物品 解题思路 类似没有上司的舞会 其实就是在基环树森林&#xff0c;我们可以利用二次树形dp的方法。 先找到环&#xff0c;然后强行…

从头编写 asp.net core 2.0 web api 基础框架 (5) EF CRUD

Github源码地址&#xff1a;https://github.com/solenovex/Building-asp.net-core-2-web-api-starter-template-from-scratch 这是第一大部分的最后一小部分。要完成CRUD的操作。 Repository Pattern 我们可以直接在Controller访问DbContext&#xff0c;但是可能会有一些问题: …

做这个网站原因之二

讲讲我最近干了什么事吧以及以后该干啥 其实大部分我学到的东西&#xff0c;都写在博客上了&#xff0c;可以通过博客看到一个人的学习轨迹。除了这些&#xff0c;我也尝试拍些视频去学习一些新的东西。视频剪辑&#xff0c;特效什么的都在尝试。 有个视频我也只是随便尝试尝试…

ssl提高组周四备考赛【2018.11.1】

前言 呆学校呆4天依旧不想复习期中&#xff0c;期中考凉透了。 成绩 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC1112014lyk2014lyk2014lyk2002002001001001007070703030302222017wyc2017wyc2017wyc1801801801001001008080800003332017xjq2017xjq2017xjq17017017…

spring cloud+dotnet core搭建微服务架构:配置中心续(五)

前言 上一章最后讲了&#xff0c;更新配置以后需要重启客户端才能生效&#xff0c;这在实际的场景中是不可取的。由于目前Steeltoe配置的重载只能由客户端发起&#xff0c;没有实现处理程序侦听服务器更改事件&#xff0c;所以还没办法实现彻底实现这一功能。这一章的例子&…

聊聊最近吧

讲讲我最近干了什么事吧以及以后该干啥 其实大部分我学到的东西&#xff0c;都写在博客上了&#xff0c;可以通过博客看到一个人的学习轨迹。除了这些&#xff0c;我也尝试拍些视频去学习一些新的东西。视频剪辑&#xff0c;特效什么的都在尝试。 有个视频我也只是随便尝试尝试…

C# 实现虚拟数字人

随着Ai技术的提升和应用&#xff0c;虚拟数字人被广泛应用到各行各业中。为我们的生活和工作提供了非常多的便利和色彩。 通过设置虚拟数字人的位置大小&#xff0c;可以让数字人可以在电脑屏幕各个位置显示&#xff1a; 虚拟数字人素材&#xff1a; 虚拟数字人(实际有语音&am…

AspectCore.Extension.Reflection : .NET Core反射扩展库

在从零实现AOP的过程中&#xff0c;难免会需要大量反射相关的操作&#xff0c;虽然在.net 4.5/.net core中反射的性能有了大幅的优化&#xff0c;但为了追求极致性能&#xff0c;自己实现了部分反射的替代方案&#xff0c;包括构造器调用、方法调用、字段读写&#xff0c;属性读…

P2468-[SDOI2010]粟粟的书架【主席树,二维前缀和】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP2468 题目大意 对于每一个询问&#xff0c;求一个区域内最少取多少个数使它们的和不小于a。 解题思路 我们肯定取最大的 对于前50%的数据&#xff0c;用 sumi,j,ksum_{i,j,k}sumi,j,k​表示(1,1)(1,…

【分享】通过手游赚¥

这本来是个回答&#xff0c;但是在知乎被删了&#xff0c;于是我决定还是在自己网站再发一份&#xff0c;特么知乎店大欺人&#xff0c;我一这么水回答&#xff0c;还被认为是广告营销 首先说明一点&#xff0c;这个完全是自我经历&#xff0c;一种分享吧。觉得假的自然假。 我…

C++描述杭电OJ 2008.数值统计 ||

C描述杭电OJ 2008.数值统计 || Problem Description 统计给定的n个数中&#xff0c;负数、零和正数的个数。 Input 输入数据有多组&#xff0c;每组占一行&#xff0c;每行的第一个数是整数n&#xff08;n<100&#xff09;&#xff0c;表示需要统计的数值的个数&#xff…

Azure Cosmos DB技术性解读

Azure Cosmos DB是微软公司打造的一项全球分布式、横向分区、多模型数据库服务。该服务允许客户弹性&#xff08;及独立形式&#xff09;跨越任意数量地理服务区对吞吐量与存储进行扩展。Azure Cosmos DB可立足第99百分位比例提升99.99%高可用性水平&#xff0c;提供可预测吞吐…

NOIP2018-普及总结

前言 原本说要去提高的&#xff0c;然后市里瞎搞&#xff0c;就去不了了QVQQVQQVQ。 总结 这次一看感觉题目比较难&#xff0c;所以基本凉凉… 首先这次有很多失误&#xff0c;特别是T2T2T2&#xff0c;其实很容易就分析出要用longlonglong\ \ longlong long的&#xff0c;但…

语音服务——阿里云

一、语音通知 语音通知是指通过调用语音呼叫的API&#xff0c;从运营商网络向指定号码发起一通呼叫&#xff0c;呼叫被应答后&#xff0c;播放一段指定的音频。 根据音频形式的不同&#xff0c;语音通知的API分为两个&#xff1a; 若播放的音频为固定内容的音频文件&#xf…

【博客】csdn搬家到wordpress

在wordpress的插件中搜索cnblogs2wp&#xff0c;安装后&#xff0c;在工具->导入->选博客搬家&#xff0c; 遇到了些问题 总是遇到博客地址不对 https://blog.csdn.net/weixin_43560272 首先修改了后缀 这是我的博客首页地址绝对没错的啊 后缀绝对改了的 总是说地址…

C++描述杭电OJ 2009.求数列的和 ||

C描述杭电OJ 2009.求数列的和 || Problem Description 数列的定义如下&#xff1a; 数列的第一项为n&#xff0c;以后各项为前一项的平方根&#xff0c;求数列的前m项的和。 Input 输入数据有多组&#xff0c;每组占一行&#xff0c;由两个整数n&#xff08;n<10000&…