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

asp.net core mvc 对应着 .NET Framework 中的 ASP.NET MVC, 前者可以跨平台,可扩展,高性能,不过令人惊讶的是,虽然 ASP.NET Core 提供了大量的可选项可以完美的处理 404 错误,但 ASP.NET Core MVC 在默认情况下并没有选择它们,你说奇怪不?

这就造成了当请求一个不存在的页面时,应用程序将会返回一个 404 错误,ASP.NET Core MVC 目前会展示一个浏览器通用的错误页,如下图所示:


这篇文章我准备讨论 3种 方式来优雅的处理这种 404 错误。

接下来我会在 Visual Studio 2019 中创建一个 ASP.NET Core MVC 项目,用这个项目去展示如何处理 404 错误。

然后把 ASP.NET Core MVC 项目跑起来,你会看到应用程序默认的首页,上面还带一行 welcome 的欢迎语?,如下图所示:


接下来我们尝试在浏览器中输入一个不存在的网址,比如说:http://localhost:6440/welcome, 这时候 ASP.NET Core MVC 引擎将会访问这个地址的资源,可想而知,引擎肯定会返回一个 404 错误,你也会看到如下错误页,通常情况下这是非常让人难堪的,对吧。


检查 ASP.NET Core MVC 的 Response.StatusCode

有几种方式可以比较完美的处理这种默认的 404 错误,一个简单的方案就是去检查 response 的 http 状态码,一旦发现这个 status = 404,你可以重定向到一个web 中存在的页面或者一个特定的错误页,下面的代码展示了,你可以在 Startup.Configure 方法中进行全局判断,一旦发现404错误就导向 home 页面。

    public class Startup    {

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)        {            app.Use(async (context, next) =>            {                await next();                if (context.Response.StatusCode == 404)                {                    context.Request.Path = "/Home";                    await next();                }            });        }    }

接下来运行web程序,然后键入 http://localhost:6440/welcome,你会发现最终展示了 home 页面。

下面是  Configure 方法的完整代码。

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)        {            if (env.IsDevelopment())            {                app.UseDeveloperExceptionPage();            }            else            {                app.UseExceptionHandler("/Home/Error");            }            app.Use(async (context, next) =>            {                await next();                if (context.Response.StatusCode == 404)                {                    context.Request.Path = "/Home";                    await next();                }            });            app.UseStaticFiles();            app.UseRouting();            app.UseAuthorization();            app.UseEndpoints(endpoints =>            {                endpoints.MapControllerRoute(                    name: "default",                    pattern: "{controller=Home}/{action=Index}/{id?}");            });        }

使用 UseStatusCodePages 中间件

第二种可选的解决方案是,采用 ASP.NET Core 中内置的 UseStatusCodePages 中间件,下面的代码展示了如何在 Startup.Configure 方法中去实现 StatusCodePages 。

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)        {            app.UseStatusCodePages();            //Other code        }

现在你可以把程序跑起来然后浏览一下这个不存在的资源,下图展示了这种情况下的输出结果:


使用 UseStatusCodePagesWithReExecute 中间件

你可以利用 UseStatusCodePagesWithReExecute 中间件来处理 那种 Response 还没开始构建 就遇到的一些不成功的状态,有点绕哈,因此这个中间件不会处理 Response status 等于 404 的情况,当 404 发生的时候,这个中间件要做的就是将 request 重定向到另外一个 Action 去处理这个错误。

下面的代码展示了如何使用这个中间件将 request 重定向到另外一个 action 方法。

app.UseStatusCodePagesWithReExecute("/Home/HandleError/{0}");

然后再来看一下被重定向的 Action 方法。

[Route("/Home/HandleError/{code:int}")]public IActionResult HandleError(int code){   ViewData["ErrorMessage"] = $"Error occurred. The ErrorCode is: {code}";   return View("~/Views/Shared/HandleError.cshtml");}

现在我把展示错误信息的 HandleError 视图的创建留给你去实现吧!?

最后,你可能想为一些错误码创建一些特定的view,比如说,你可以创建 Home/Error/500.cshtml 或者 Home/Error/404.cshtml 视图,然后根据 http status code 的值重定向到合适的错误页。

另外一种处理 404 错误的方式是使用一个自定义的页面,然后在页面上设置一些特定的错误代码,这样也方便隐藏一些比较重要的信息,比如将 404 改成 服务压力大,请联系管理员 等等,一旦应用程序发生错误,你可以将用户导向你设置的错误页,然后展示你设置的错误信息。

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

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

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

  2. 如何在 Asp.Net Core MVC 中处理 null 值

    译文链接:https://www.infoworld.com/article/3434624/how-to-handle-null-values-in-aspnet-core-mvc.html 传统的 ...

  3. 如何在ASP.NET Core应用中实现与第三方IoC/DI框架的整合?

    我们知道整个ASP.NET Core建立在以ServiceCollection/ServiceProvider为核心的DI框架上,它甚至提供了扩展点使我们可以与第三方DI框架进行整合.对此比较了解的读 ...

  4. 如何在 ASP.NET Core MVC 5 中处理未知的 Action

    ASP.NET Core MVC 5 是一个轻量级,开源的,利于单元测试的基于 ASP.NET Core 运行时的 web 框架,在开发时你肯定会遇到不少那些 request 无法匹配 Action ...

  5. 如何在 ASP.NET Core 中实现全局异常拦截

    异常是一种运行时错误,当异常没有得到适当的处理,很可能会导致你的程序意外终止,这篇就来讨论一下如何在 ASP.Net Core MVC 中实现全局异常处理,我会用一些 样例代码 和 截图 来说明这些概 ...

  6. 获取异常信息_如何在 ASP.NET Core 中实现全局异常拦截

    异常是一种运行时错误,当异常没有得到适当的处理,很可能会导致你的程序意外终止,这篇就来讨论一下如何在 ASP.Net Core MVC 中实现全局异常处理,我会用一些 样例代码 和 截图 来说明这些概 ...

  7. [第二篇]如何在ASP.Net Core的生产环境中使用OAuth保护swagger ui

    在我上篇文章如何在ASP.Net Core的生产环境中保护swagger ui中,我们讨论了如何使用基本身份验证来保护 swagger ui. 使用 OAuth 2.0 和 OpenIdConnect ...

  8. 如何在 ASP.NET Core 中使用 HttpClientFactory ?

    ASP.Net Core 是一个开源的,跨平台的,轻量级模块化框架,可用它来构建高性能的Web程序,这篇文章我们将会讨论如何在 ASP.Net Core 中使用 HttpClientFactory. ...

  9. 如何在 ASP.Net Core 中使用 Autofac

    依赖注入可以有效的实现对象之间的 松耦合 并能够实现代码的可测试和可维护性,ASP.Net Core 提供了一个极简版的容器实现对 依赖注入 的原生支持,然而内置的依赖注入容器相比成熟的 依赖注入容器 ...

最新文章

  1. android插件化-apkplug中以监听方式获取OSGI服务-09
  2. 捷报!又一名HIV感染者被治愈,干细胞移植再次立功
  3. linux mysql5.7.11安装_Linux下安装MySQL 5.7.11
  4. html显示数据库表格asp,ASP实现在WEB中显示电子表格数据 显示数据及生成HTML表格...
  5. 『一本通』差分约束系统
  6. 百度地图2.1获取密钥配置的Android签名证书的sha1值
  7. 内核中的HZ 及延迟等
  8. 1127 ZigZagging on a Tree (30 分)【难度: 一般 / 知识点: 根据中序遍历 后序遍历建树】
  9. php 动态切换数据库,thinkphp多数据库动态切换
  10. git指令快捷 idea_IDEA+Git+Gitlab使用详细教程
  11. Unity应用架构设计(1)—— MVVM 模式的设计和实施(Part 2)
  12. python成绩转换、百分制到五分制_设计一个程序,将从键盘上输入的百分制成绩转换成对应的五分制成绩并输出。90分以上为A,80~90分为B,...
  13. IO之 Properties类加载文件
  14. 《Adobe Dreamweaver CS6中文版经典教程》——第2课 HTML基础2.1 什么是HTML
  15. 图灵奖背后:一个奥斯卡拿到手软,一个公司卖了 160 亿
  16. Window2003 IIS+MySQL+PHP+Zend环境配置
  17. 「我们的首要之务,并不是遥望模糊的远方,而是专心处理眼前的事务。」---这是卡内基先生所强调的克服忧虑、开创人生的关键。...
  18. multisim怎么设置晶体管rbe_multisim晶体管
  19. 图像处理 var_threshold与binary_threshold
  20. php 499,nginx499错误

热门文章

  1. Python3中异常处理和try/except,try/finally的用法
  2. Python | 常见的反爬及解决方法,值得收藏
  3. 选择排序 - python实现详解
  4. c#自定义事件的使用方法
  5. 自己开发的一款基于PagedDataSource的datalist repeater控件,只需要在源程序中添加三行代码,即可实现通用分页
  6. NLP《词汇表示方法(三)word2vec》
  7. leetcode - 448. 找到所有数组中消失的数字
  8. pytorch——计算图与动态图机制
  9. TX2刷机flashOS finished后,卡在determining IP address解决方案
  10. 消息中间件的技术选型心得-RabbitMQ ActiveMQ和ZeroMQ