ASP.NET核心学习教程中自定义异常处理的详细说明
为什么选择中间件进行异常处理?
传统的ASP.NET可以使用异常过滤器来处理异常。在ASP.NET核心中,请求是以由多个中间件连接的管道的形式处理的。但是,保留了五个常用的过滤器,异常过滤器也可以用来处理异常。但是,异常过滤器不能处理除MVC中间件之外的异常。为了全局统一,使用中间件处理异常更合适
为什么选择定制异常中间件?
首先,让我们看一下在ASP.NET核心中构建的三个异常处理中间件:developerexceptionpage middleware、ExceptionHandlerMeddleware和StatusCodePagesMiddleware
1.DeveloperExceptionPageMiddleware中间件
可以给出详细的请求/返回/错误信息,因为它包含敏感信息,它只适合开发环境
2.ExceptionHandlerMiddleware(申江博客:https://www.jb51.net/article/153926.htm)
仅处理500个错误
3.状态管理软件(申江博客:https://www.jb51.net/article/153931.htm)
400-599之间的错误可以处理,但是Response不能包含内容(content length=0 content type=null,无法通过实验响应mvc中未捕获的异常)
ExceptionHandlerMiddleware和StatusCodePagesMiddleware由于各自的限制,需要一起使用。相比之下,定制中间件更加灵活,不仅可以统一处理各种错误状态,还可以根据配置决定处理方式。
客户异常中间件
首先,声明异常中间件的配置类
///summary////异常中间件配置对象/////summary公共类customexceptionmiddleware option { public customexceptionmiddleware option(CustomExceptionHandleType handleType=CustomExceptionHa handleType。JsonHandle,IListPathString jsonHandleUrlKeys=null,string errorHandingPath=' '){ HandleType=HandleType;jsonhandlerlkeys=jsonhandlerlkeys;ErrorHandingPath=ErrorHandingPath;}///summary////异常处理方法////summary public customexceptionhandletype handletype { get;设置;}///summary////JSON处理模式的Url关键字///para只有在HandleType=Both/para////summary public ilistpathtstring jsonhandlerkeys { get;设置;}///summary////错误跳转页////summary public path string error handling path { get;设置;} }///summary////错误处理方法////summary public enum customexceptionhandletype { JSON handle=0,//JSON表单处理PageHandle=1,//跳转网页处理Both=2 //根据Url关键字自动处理}声明异常中间件的成员
///summary ///pipeline请求委托////summary私有请求委托_ next///summary///configuration object////summary private customexceptionmiddleware option _ option;///summary////待处理状态码字典////summary private idictionaryint,string exceptionstatuscodedicpublic CustomExceptionMiddleWare(request delegate next,CustomExceptionMiddleWare option选项){ _ next=next_ option=optionexceptionstatuscodedic=new dictionary int,string {{401,'未经授权的请求' },{404,'找不到页面' },{403,'拒绝访问' },{500,'服务器有意外错误' }//其余状态自行扩展};}异常中间件的主要逻辑
公共异步任务调用(HttpContext上下文){异常异常=null尝试{ await _next(上下文);//调用管道执行下一个中间件} catch(异常ex) { context .响应。clear();语境回应。StatusCode=500//发生未捕获的异常,手动设置状态码异常=ex}最后{ if (exceptionStatusCodeDic .ContainsKey(上下文。响应。StatusCode)!语境项目。包含键('异常处理')//预处理标记{ var errorMsg=string .空的;如果(上下文。响应。状态代码==500异常!=null){错误消息=$ ' { exceptionStatusCodeDic[context .响应。状态代码]}\r\n{(异常InnerException!=null?例外。内部异常。消息:异常。消息)} ';} else {错误消息=exceptionStatusCodeDic[context .回应。状态码];}异常=新异常(错误消息);}如果(异常!=null) { var handleType=_option .handleType if(handleType==CustomExceptionHandleType .两者)//根据全球资源定位器(统一资源定位符)关键字决定异常处理方式{ var requestPath=context .请求。路径;handleType=_option .JsonHandleUrlKeys!=null _option .JsonHandleUrlKeys。计数(k=上下文请求。路径。以段开始(k,StringComparison .CurrentCultureIgnoreCase)) 0?CustomExceptionHandleType .JsonHandle : CustomExceptionHandleType .PageHandle } if(handleType==CustomExceptionHandleType .JsonHandle)等待JsonHandle(上下文,异常);否则等待页面句柄(上下文,异常,_选项.错误处理路径);} } } ///摘要///统一格式响应类////summary////param name=' ex '/param///returns/returns private ApiResponse GetApiResponse(Exception ex){ return new ApiResponse(){ issuess=false,Message=ex .消息};} ///摘要///处理方式:返回数据格式////summary////param name=' context '/param///param name=' ex '/param///returns/returns private async Task JsonHandle(HttpContext context,Exception ex){ var apiResponse=GetPiresponse(ex);var serialzeStr=JsonConvert .SerializeObject(ApiResponse);语境。响应。content type=' application/JSON ';等待上下文。响应。写异步(串行,编码. UTF8);} ///摘要///处理方式:跳转网页////summary////param name=' context '/param///param name=' ex '/param///param name=' path '/param///返回/返回私有异步任务页面句柄(HttpContext上下文,异常,例如,路径字符串路径){上下文.项目。添加('例外,例如);var originPath=上下文。请求。路径;语境。请求。路径=路径;//设置请求页面为错误跳转页面尝试{ await _next(上下文);} catch { }终于{ context .请求。路径=原始路径;//恢复原始请求页面} }使用扩展类进行中间件注册
公共静态类customexceptionmiddleware扩展{公共静态IApplicationBuilder UseCustomException(此IApplicationBuilder应用程序,customexceptionmiddleware选项选项){返回应用程序.使用中间件中间件(选项);} }在Startup.cs的配置f方法中注册异常中间件
应用程序.UseCustomException(新customexceptionmiddletype选项(handletype : CustomExceptionHandleType .两者都有,//根据全球资源定位器(统一资源定位符)关键字决定处理方式jsonhandleurlkeys :新路径字符串[]{"/API"},errorhandlingpath : '/home/error ');接下来我们来进行测试,首先模拟一个将会进行页面跳转的未经捕获的异常
访问/家/关于的结果
访问/home/test的结果(该地址不存在)
好异常跳转页面的方式测试完成,接下来我们测试返回统一格式(json)的异常处理,同样先模拟一个未经捕获的异常
访问/API/令牌/getter错误的结果
访问/API/令牌/测试的结果(该地址不存在)
访问/api/token/getvalue的结果(该接口需要身份验证)
测试完成,页面跳转和统一格式返回都没有问题,自定义异常中间件已按预期工作
应该注意的是,定制中间件将响应每个HTTP请求,因此必须简化处理逻辑以防止不必要的性能问题
摘要
以上就是本文的全部内容。希望本文的内容对大家的学习或工作有一定的参考价值。有问题可以留言交流。谢谢你的支持。
版权声明:ASP.NET核心学习教程中自定义异常处理的详细说明是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。