加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

聊一聊Asp.net过滤器Filter那一些事

发布时间:2020-06-17 02:08:38 所属栏目:编程 来源:站长网
导读:副标题#e# 最近在整理优化.net代码时,发现几个很不友好的处理现象:登录判断、权限认证、日志记录、异常处理等通用操作,在项目中的action中到处都是。在代码优化上,这一点是很重要着力点。这时.net中的过滤器、拦截器(Filter)就派上用场了。现在根据这

OnException还有一个很重要的处理,那就是对异常结果的统一包装,返回一个很友好的结果给用户,避免把一些不必要的信息返回给用户。比如:针对MVC,那么跟进不同异常,统一调整至友好的提示页面等等;针对API,那么我们可以一个统一的返回几个封装,便于用户统一处理结果。

MVC 的异常处理实例代码:

/// <summary> /// MVC自定义异常处理机制 /// 说道异常处理,其实我们脑海中的第一反应,也该是try/cache操作 /// 但是在实际开发中,很有可能地址错误根本就进入不到try中,又或者没有被try处理到异常 /// 该类就发挥了作用,能够很好的未经捕获的异常,并做相应的逻辑处理 /// 自定义异常机制,主要集成HandleErrorAttribute 重写其OnException方法 /// </summary> public class XYHMVCHandleError : HandleErrorAttribute { /// <summary> /// 处理异常 /// </summary> /// <param>异常上下文</param> public override void OnException(ExceptionContext filterContext) { // 我们在平时的项目中,异常处理一般有两个作用 // 1:记录异常的详细日志,便于事后分析日志 // 2:对异常的统一友好处理,比如根据异常类型重定向到友好提示页面 // 在这里面既能获取到未经处理的异常信息,也能获取到请求信息 // 在此可以根据实际项目需要做相应的逻辑处理 // 下面简单的列举了几个关键信息获取方式 // 控制器名称 注意,这样获取出来的是一个文件的全路径 string contropath = filterContext.Controller.ToString(); // 访问目录的相对路径 string filePath = filterContext.HttpContext.Request.FilePath; // url完整地址 string url = (filterContext.HttpContext.Request.Url.AbsoluteUri).ExUrlDeCode(); // 请求方式 post get string httpMethod = filterContext.HttpContext.Request.HttpMethod; // 请求IP地址 string ip = filterContext.HttpContext.Request.GetIPAddress(); // 获取全部的请求参数 HttpRequest httpRequest = HttpContext.Current.Request; Dictionary<string, string> queryParameters = httpRequest.GetAllQueryParameters(); // 获取异常对象 Exception ex = filterContext.Exception; // 异常描述信息 string exMessage = ex.Message; // 异常堆栈信息 string stackTrace = ex.StackTrace; // 根据实际情况记录日志(文本日志、数据库日志,建议具体步骤采用异步方式来完成) filterContext.ExceptionHandled = true; // 模拟根据不同的做对应的逻辑处理 int statusCode = filterContext.HttpContext.Response.StatusCode; if (statusCode>=400 && statusCode<500) { filterContext.Result = new RedirectResult("/html/404.html"); } else { filterContext.Result = new RedirectResult("/html/500.html"); } } }

API 的异常处理实例代码:

/// <summary> /// API自定义异常处理机制 /// 说道异常处理,其实我们脑海中的第一反应,也该是try/cache操作 /// 但是在实际开发中,很有可能地址错误根本就进入不到try中,又或者没有被try处理到异常 /// 该类就发挥了作用,能够很好的未经捕获的异常,并做相应的逻辑处理 /// 自定义异常机制,主要集成ExceptionFilterAttribute 重写其OnException方法 /// </summary> public class XYHAPIHandleError : ExceptionFilterAttribute { /// <summary> /// 处理异常 /// </summary> /// <param>异常上下文</param> public override void OnException(HttpActionExecutedContext actionExecutedContext) { // 我们在平时的项目中,异常处理一般有两个作用 // 1:记录异常的详细日志,便于事后分析日志 // 2:对异常的统一友好处理,比如根据异常类型重定向到友好提示页面 // 在这里面既能获取到未经处理的异常信息,也能获取到请求信息 // 在此可以根据实际项目需要做相应的逻辑处理 // 下面简单的列举了几个关键信息获取方式 // action名称 string actionName = actionExecutedContext.ActionContext.ActionDescriptor.ActionName; // 控制器名称 string controllerName =actionExecutedContext.ActionContext.ControllerContext.ControllerDescriptor.ControllerName; // url完整地址 string url = (actionExecutedContext.Request.RequestUri.AbsoluteUri).ExUrlDeCode(); // 请求方式 post get string httpMethod = actionExecutedContext.Request.Method.Method; // 请求IP地址 string ip = actionExecutedContext.Request.GetIPAddress(); // 获取全部的请求参数 HttpRequest httpRequest = HttpContext.Current.Request; Dictionary<string, string> queryParameters = httpRequest.GetAllQueryParameters(); // 获取异常对象 Exception ex = actionExecutedContext.Exception; // 异常描述信息 string exMessage = ex.Message; // 异常堆栈信息 string stackTrace = ex.StackTrace; // 根据实际情况记录日志(文本日志、数据库日志,建议具体步骤采用异步方式来完成) // 自己的记录日志落地逻辑略 ...... // 构建统一的内部异常处理机制,相当于对异常做一层统一包装暴露 MBaseResult<string> result = new MBaseResult<string>() { Code = MResultCodeEnum.systemErrorCode, Message = MResultCodeEnum.systemError }; actionExecutedContext.Response = new HttpResponseMessage(HttpStatusCode.OK); //需要自己指定输出内容和类型 HttpContext.Current.Response.ContentType = "text/html;charset=utf-8"; HttpContext.Current.Response.Write(JsonConvert.SerializeObject(result)); HttpContext.Current.Response.End(); // 此处结束响应,就不会走路由系统 } }

总结

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读