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


  • statusCodeResult.OriginalPath可以获取URL请求信息 。
  • statusCodeResult.OriginalQueryString可以获取查询字符串的搜索信息 。
然后 , 在NotFound视图中进行自定义错误内容的优化 , 代码如下 。
@{ViewBag.Title = "页面不存在";}@ViewBag.ErrorMessage@ViewBag.Path@ViewBag.QS单击此处返回首页重新运行程序 , 在地址栏中输入http://localhost:13380/market/food/3?name=apple , 得到的返回视图如图19.7所示 。
ASP.NET Core MVC中的两种404错误文章插图
图19.7
通过运行对比可以得知 , UseStatusCodePagesWithReExecute()中间件不会改变请求地址 , 而UseStatusCodePagesWithRedirects()中间件则会跳转到ErrorController中进而改变请求地址 。 我们推荐采用UseStatusCodePagesWithReExecute()中间件 , 保留错误的URL信息 , 便于记录到日志文件中 , 这会在后面的章节中实现 。
19.5 ASP.NET Core中的全局异常处理在本节中 , 我们将学习如何在ASP.NET Core中实现全局异常处理程序 , 并呈现任意非正常请求 。
在以下Details()操作方法中 , 我们故意使用throw关键字抛出异常 。
public ViewResult Details(int?id){throw new Exception("在Details视图中抛出异常");//其他代码}访问http://localhost:13380/Home/Details/2 , 结果如图19.8所示 。
ASP.NET Core MVC中的两种404错误文章插图
图19.8
可以看到返回的状态码是500 , 因为500错误是来自服务器的内部错误 。
19.5.1 ASP.NET Core中的UseDeveloperExceptionPage中间件UseDeveloperExceptionPage()中间件是指当代码触发异常时 , 会进入开发者异常页面 , 代码如下 。
public void Configure(IApplicationBuilder app , IHostingEnvironment env){if(env.IsDevelopment()){app.UseDeveloperExceptionPage();}//其他代码}从上面的代码中我们得知 , 已经将DeveloperExceptionPage()中间件配置到HTTP请求处理管道中, 因此在开发环境中运行应用程序时 , 如果存在未处理的异常 , 则会触发如图19.9所示的开发人员异常页面 。
ASP.NET Core MVC中的两种404错误文章插图
图19.9
这里需要将launchSettings.json中的ASPNETCORE_ENVIRONMENT变量设置为Development 。
因为我们添加了env.IsDevelopment()的判断 , 所以DeveloperExceptionPage()中间件只能在开发环境中触发 , 即环境变量为Development 。 比如 , 在Production这样的非开发环境中使用此页面存在安全风险 , 因为它包含可供攻击者使用的详细异常信息 , 而且此开发异常页面对最终用户也没有任何意义 。
19.5.2 ASP.NET Core中的非开发环境异常信息现在我们需要在本地开发计算机上模拟生产环境 , 应修改应用程序中的环境变量 。 打开launchSettings.json文件将其中的ASPNETCORE_ENVIRONMENT变量设置为Production , 表示当前开发环境已经为Production(生产环境) , 代码如下 。
"ASPNETCORE_ENVIRONMENT":"Production"在默认情况下 , 如果在生产等非开发环境中存在未处理的异常 , 则会看到如图19.10所示的默认页面 。
ASP.NET Core MVC中的两种404错误文章插图
图19.10
请注意 , 图19.10中除显示HTTP ERROR 500之外 , 没有显示任何其他信息 。 错误500表示服务器上出现错误 , 服务器不知道如何处理 。
【ASP.NET Core MVC中的两种404错误】此默认页面对最终用户不是很有用 。 我们希望处理异常并将用户重定向到自定义错误视图 , 这更有意义 。
19.5.3 ASP.NET Core中的异常处理ASP.NET Core中异常处理的步骤如下所示 。
对于非开发环境 , 使用UseExceptionHandler()方法将异常处理中间件添加到请求处理管道 。 遇到异常的时候 , 异常处理中间件会跳转到ErrorController中 , 我们需要打开Startup类的Configure()方法 , 代码如下 。
public void Configure(IApplicationBuilder app , IWebHostEnvironment env){if(env.IsDevelopment()){app.UseDeveloperExceptionPage();}else{app.UseExceptionHandler("/Error");}//其他代码}修改ErrorController代码 , 它会搜索异常详细信息并返回到指定的自定义错误视图 。 在生产中 , 不会在错误视图上显示异常详细信息 。 我们可以将它们记录到数据库表、文件和事件查看器等 , 以便开发人员查看它们 , 并在需要时提供代码修复 。 我们将在稍后的章节中讨论日志记录 。
public class ErrorController:Controller{[Route("Error")]public IActionResult Error(){//获取异常细节var exceptionHandlerPathFeature =HttpContext.Features.Get