asp.net core mvc 对应着 .NET Framework 中的 ASP.NET MVC, 前者可以跨平台,可扩展,高性能,不过令人惊讶的是,虽然 ASP.NET Core 提供了大量的可选项可以完美的处理 404 错误,但 ASP.NET Core MVC 在默认情况下并没有选择它们,你说奇怪不?
这就造成了当请求一个不存在的页面时,应用程序将会返回一个 404 错误,ASP.NET Core MVC 目前会展示一个浏览器通用的错误页,如下图所示:
接下来我们尝试在浏览器中输入一个不存在的网址,比如说:http://localhost:6440/welcome
, 这时候 ASP.NET Core MVC 引擎将会访问这个地址的资源,可想而知,引擎肯定会返回一个 404 错误,你也会看到如下错误页,通常情况下这是非常让人难堪的,对吧。
你可以利用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 改成 服务压力大,请联系管理员
等等,一旦应用程序发生错误,你可以将用户导向你设置的错误页,然后展示你设置的错误信息。