问题

在没有修改任何配置的情况下,这是用户使用 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跨平台或扫描二维码关注

ASP.NET Core 处理 404 Not Found相关推荐

  1. iactionresult 图片_从显式类型的ASP.NET Core API控制器(不是IActionResult)返回404

    在ASP.NET Core 2.1中使用return null;解决了此问题: public ActionResult Get(int id) { Thing thing = GetThingFrom ...

  2. Asp.Net Core 404处理

    在使用Asp.Net Core Mvc时 404处理整理如下 一.自带404状态处理 1.控制器视图子弹404视图 NotFoundResult,NotFoundObjectResult //// 摘 ...

  3. asp 判断数组等于_如何在 ASP.NET Core MVC 中处理 404 错误

    译文链接:https://www.infoworld.com/article/3545304/how-to-handle-404-errors-in-aspnet-core-mvc.html http ...

  4. ssm框架使用重定向报404_如何在 ASP.NET Core MVC 中处理 404 错误

    译文链接:https://www.infoworld.com/article/3545304/how-to-handle-404-errors-in-aspnet-core-mvc.html asp. ...

  5. ASP.NET Core MVC中的两种404错误

    我们在使用某些系统的时候,如果访问了一个不存在的地址怎么办,比如http://52abp. com/airport/fly:或者访问的地址路由和操作方法虽然存在,但是地址参数id不存在,比如https ...

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

    第1部分:http://www.cnblogs.com/cgzl/p/7637250.html 第2部分:http://www.cnblogs.com/cgzl/p/7640077.html 第3部分 ...

  7. asp.net core系列 38 WebAPI 返回类型与响应格式--必备

    一.返回类型 ASP.NET Core 提供以下 Web API Action方法返回类型选项,以及说明每种返回类型的最佳适用情况: (1) 固定类型 (2) IActionResult (3) Ac ...

  8. 007.Adding a view to an ASP.NET Core MVC app -- 【在asp.net core mvc中添加视图】

    索引: 目录索引 Adding a view to an ASP.NET Core MVC app 在asp.net core mvc中添加视图 2017-3-4 7 分钟阅读时长 本文内容 1.Ch ...

  9. Asp.net core 学习笔记 ( Web Api )

    更新 : 2019-06-03  web api 返回 json 的情况下默认会把属性 PascalCase 变成 camelCase 很贴心哦. 如果你不喜欢可以修改它 services.AddMv ...

最新文章

  1. matlab 求解黄金分割率
  2. Linux操作系统Ubuntu部署Mysql篇
  3. python初中必背语法_初中必背英语语法知识汇总
  4. Cisco 2811 IOS 升级实战
  5. 嫁人要嫁IT男 ,嫁对了人天天都是情人节
  6. linux下安装jmeter
  7. 2021【第十二届蓝桥杯省赛】 C/C++ B组(第一场)
  8. 2010-2019年中国城市统计年鉴分享
  9. matlab仿真整流电路设计,基于Matlab GUI的整流电路仿真设计[图]
  10. Resolution 归结原理
  11. 豪迪QQ群发通杀破解补丁使用教程
  12. 中望CAD的lisp编辑器_中望CAD 2020中文版
  13. 螃蟹RTS5733DL固态硬盘,曲线救盘案例……
  14. iOS上传图片方向不对处理
  15. matlab 将图片制作成视频并将视频输出为图片
  16. 耶鲁女孩:改变,从背单词开始!(刘畅:我知道耶鲁会录取我的。学习,都要经历死记硬背)
  17. 一篇文章说完Flutter页面路由导航及传参
  18. 使用 JavaScript 的代价!(2018 版)
  19. 一千年前的李白早就预言360与腾讯之战
  20. 如何用SPSS进行数据分析?

热门文章

  1. 网构软件-Internetware
  2. std::bind 详解及参数解析
  3. IDEA中maven如何将jar包导入本地的maven库
  4. winform进度条实现
  5. 最新.NET MAUI有什么惊喜?
  6. 如何通过提问成为更好的开发人员
  7. 使用 C# 下载文件的十八般武艺
  8. .NET Core 使用Topshelf方式创建Windows服务
  9. Ids4 认证保护 API 方案更新
  10. 网络知识 | 《图解TCP/IP》读书笔记(下)