更新记录
转载请注明出处:
2022年11月22日 发布。
2022年11月20日 从笔记迁移到博客。
ASP.NET Core中的错误处理分为:
局部Controller中处理错误
在Controller中定义错误代码和转到错误界面即可
全局应用中设置错误处理
局部Controller中处理错误,要在每个Controller中定义会非常麻烦
并且也没有办法处理路由不匹配的异常处理
直接设置返回状态码为404,然后返回错误页面即可
public IActionResult Index(int id)
{//判断记录是否存在//假设记录不存在if(false){//设置状态码为404Response.StatusCode = 404;//返回错误视图View("RecordErrorView", id);}return View();
} 在ASP.NET Core应用中有两种类型的404错误可能发生:
在控制器中找不到ID
请求的URL和路由不匹配
在ASP.NET Core中有统一处理异常的中间件
UseStatusCodePages() 显示404代码和说明给用户
UseStatusPagesWithRedirects() 当出现404错误就跳转到指定的URL
UseStatusPagesWithReExecute() 当出现404错误就跳转到指定的URL,但URL不变
UseStatusPagesWithRedirects 返回200,而ReExecute()返回404
UseStatusPagesWithRedirects 会改变URL,而ReExecute()不会
当用户访问不存在的URL会返回404 信息

启用该中间件的代码:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}else{app.UseStatusCodePages();}
} 中间件工作原理:
\1. 用户访问不存在的URL,触发404状态码
\2. UseStatusCodePagesWithRedirects()中间件拦截404状态码,并更改为302,跳转即开发人员指定的参数,比如”/Error/404”
\3. 因为使用了重定向,所以URL会发生改变
\4. 请求会经过MVC,最终返回的是200,然后导航到View指定的视图
\5. 整个过程对浏览器来说都是200,没有404的过程
当出现404错误就跳转到指定的URL
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{if (env.IsDevelopment()){app.UseDeveloperExceptionPage();//出现404错误就跳转到指定的页面app.UseStatusCodePagesWithRedirects("/");}
} 还可以指定参数
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{if (env.IsDevelopment()){app.UseDeveloperExceptionPage();//出现404错误就跳转到指定的页面app.UseStatusCodePagesWithRedirects("/{0}");}
} 中间件工作原理:
\1. 用户访问不存在的URL,触发404状态码
\2. UseStatusCodePagesWithReExecute()中间件拦截404状态码并重新执行将其执行URL管道,即开发人员指定的参数,比如”/Error/404”
\3. 整个请求经流HTTP管道并由MVC中间件处理,该中间件返回视图的状态码为200
\4. 当响应流出到客户端时,它会通过UseStatusCodePageWithReExecute()中间件将状态码转为404
\5. 因为整个过程只是重新执行管道而不发出重定向请求。所以URL没有变化
当出现404错误就跳转到指定的URL
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{if (env.IsDevelopment()){app.UseDeveloperExceptionPage();//出现404错误就跳转到指定的页面app.UseStatusCodePagesWithReExecute("/");}
} 还可以指定参数
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{if (env.IsDevelopment()){app.UseDeveloperExceptionPage();//出现404错误就跳转到指定的页面app.UseStatusCodePagesWithReExecute("/{0}");}
} 当创建一个ASP.NET Core项目时
在Startup类的Configure方法中已经默认添加了
DeveloperExceptionPageMiddleware中间件
在Startup类的Configure方法中可以看到
如果是开发环境,则加载DeveloperExceptionPage中间件
否则加载ExceptionHandler中间件
处理全局异常中间件
DeveloperExceptionPage 开发环境的异常处理中间件
ExceptionHandler 适合于非开发环境的异常处理中间件
注意:
错误处理中间件应在Configure方法的一开始就添加进来
否则任何在它之前的代码所产生的错误都不会被它们处理
使用throw抛出异常实例即可
public IActionResult Index(int id)
{throw new Exception("Panda666.com");return View();
} public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{if (env.IsDevelopment()){//开发环境异常处理界面app.UseDeveloperExceptionPage();}else{//非开发环境异常处理//跳转到指定的控制器和动作app.UseExceptionHandler("/Home/Error");//The default HSTS value is 30 days.You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.app.UseHsts();}
} [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
var exceptionHandlerPathFeature =
HttpContext.Features.Get();//出现错误的Pathstring exceptionPath = exceptionHandlerPathFeature.Path;//出现错误的描述string exceptionMessage = exceptionHandlerPathFeature.Error.Message;//出现错误的调用栈string stackTraceString = exceptionHandlerPathFeature.Error.StackTrace.ToString();
}
下一篇:大家那些古风情话,20分