ASP.NET Core MVC中的两种404错误( 三 )

19.2.2 ASP.NET Core中的404错误示例以下是Startup类的Configure()方法的代码 。 读者可能已经知道 , 这个Configure() 方法用于配置ASP.NET Core应用程序的HTTP请求处理管道 。
public void Configure(IApplicationBuilder app , IWebHostEnvironment env){//如果环境是Development serve Developer Exception Pageif(env.IsDevelopment()){app.UseDeveloperExceptionPage();}//否则显示用户友好的错误页面else if(env.IsStaging() || env.IsProduction() || env.IsEnvironment("UAT")){app.UseExceptionHandler("/Error");}//使用纯静态文件支持的中间件 , 而不使用带有终端的中间件app.UseStaticFiles();app.UseRouting();app.UseEndpoints(endpoints =>{endpoints.MapControllerRoute(name:"default" ,pattern:"{controller=Home}/{action=Index}/{id?}");});}目前 , 我们在此HTTP请求处理管道中没有配置任何处理404错误的内容 。 因此 , 如果导航到http://localhost:13380/market/food , 我们会看到图19.2所示的默认404错误页面 。 这是因为URL/market/food与应用程序中的所有路由都不匹配 , 从而引发了错误 。
ASP.NET Core MVC中的两种404错误文章插图
图19.2
19.3 处理失败的HTTP状态码为了处理失败的HTTP状态码 , 比如404 , 我们可以使用以下3个内置的ASP.NET Core中间件 。

  • UseStatusCodePages() 。
  • UseStatusCodePagesWithRedirects() 。
  • UseStatusCodePagesWithReExecute() 。
19.3.1 UseStatusCodePages中间件我认为这是3个状态码中间件中最不实用的 , 因为我们很少在生产中使用它 。 要在应用程序中使用它并查看其可以执行的操作 , 请将其插入HTTP处理管道 , 代码如下 。
public void Configure(IApplicationBuilder app , IWebHostEnvironment env){//如果环境是Development serve Developer Exception Pageif(env.IsDevelopment()){app.UseDeveloperExceptionPage();}else{//用于处理错误异常app.UseStatusCodePages();}//使用纯静态文件支持的中间件 , 而不使用带有终端的中间件app.UseStaticFiles();app.UseRouting();app.UseEndpoints(endpoints =>{endpoints.MapControllerRoute(name:"default" ,pattern:"{controller=Home}/{action=Index}/{id?}");});}"IIS Express":{"commandName":"IISExpress" ,"launchBrowser":true ,"environmentVariables":{"ASPNETCORE_ENVIRONMENT":"Production" ,"MyKey":" launchsettings.json中Mykey的值"}} , 因为添加了UseStatusCodePages()中间件 , 所以如果我们浏览http://localhost:13380/market/food , 则会返回如图19.3所示的简单文本响应 。
ASP.NET Core MVC中的两种404错误文章插图
图19.3
请注意 , 当环境变量不是Development的时候 , 才会触发404错误 , 毕竟这是给用户查看的 , 所以要将launchSettings中的环境变量值修改为Staging , 否则无法触发该异常 。
19.3.2 UseStatusCodePagesWithRedirects中间件在生产中 , 我们希望拦截这些访问失败的HTTP状态码 , 并返回自定义错误视图 。 为此 , 我们可以使用UseStatusCodePagesWithRedirects()中间件或UseStatusCodePagesWith-ReExecute()中间件 , 代码如下 。
public void Configure(IApplicationBuilder app , IWebHostEnvironment env){//如果环境是Development serve Developer Exception Pageif(env.IsDevelopment()){app.UseDeveloperExceptionPage();}else{app.UseStatusCodePagesWithRedirects("/Error/{0}");}//使用纯静态文件支持的中间件 , 而不使用带有终端的中间件app.UseStaticFiles();app.UseRouting();app.UseEndpoints(endpoints =>{endpoints.MapControllerRoute(name:"default" ,pattern:"{controller=Home}/{action=Index}/{id?}");});}我们将下面的代码添加到Configure()方法中 , 如果出现404错误 , 则会将用户重定向到/Error/404 。 这里采用了占位符 {0}, 它会自动接收HTTP中的状态码 。
app.UseStatusCodePagesWithRedirects("/Error/{0}");19.3.3 添加ErrorController因为使用了UseStatusCodePagesWithRedirects()中间件 , 所以要让它统一显示错误信息 , 我们需要添加对应的控制器和视图代码 , 代码如下 。
public class ErrorController:Controller{//如果状态码为404 , 则路径将变为Error/404[Route("Error/{statusCode}")]public IActionResult HttpStatusCodeHandler(int statusCode){switch(statusCode){case 404:ViewBag.ErrorMessage = "抱歉 , 读者访问的页面不存在";break;}return View("NotFound");}}19.3.4 添加NotFound视图在Views/Error文件夹中创建一个NotFound.cshtml视图文件 , 代码如下 。
@{ViewBag.Title = "页面不存在";}@ViewBag.ErrorMessage单击此处返回首页此时 , 如果进入http://localhost:13380/market/food , 我们会看到页面已经被导航到了NotFound.cshtml页面 , 显示自定义404错误信息 , 如图19.4所示 。