背景

对于处理接口返回值统一加密,过滤,特定值统一处理,统一返回等多种需求,net的拦截器前置拦截比较常用,例如:登录校验,参数格式校验等等。接下来介绍filter。

filter过滤器实现

filter的ActionFilterAttribute可以做一定的处理,通过对OnActionExecuted的执行控制,来实现很多场景。ActionFilterAttribute类是C# ASP.net MVC中的过滤类,跟JAVA的Filter效果类似,但是Filter是接口。ActionFilterAttribute类是被abstract 修饰符修饰,表示该类只能是基类,也就是只能被继承。ActionFilterAttribute类中只有一个无参数的构造函数和四个被protected 修饰符修饰,表示该方法只限于本类和子类访问,实例不能访问。

代码实现

/// <summary>/// Service返回数据过滤器,为返回的数据增加返回码和消息/// </summary>public class ReturnDataFilterAttribute : ActionFilterAttribute{private static JsonMediaTypeFormatter _formatter;static ReturnDataFilterAttribute(){_formatter = new JsonMediaTypeFormatter();//设置序列化器为json序列化器//            _formatter.UseDataContractJsonSerializer = true;//设置时间格式为Local_formatter.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Local;_formatter.SerializerSettings.DateFormatString = "yyyy-MM-ddTHH:mm:ss.fffzz:00";//设置缩进_formatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;//设置json格式为驼峰式_formatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();}public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext){if (actionExecutedContext.Response != null){var oldResponse = actionExecutedContext.Response;//response状态为请求成功var result = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.OK);if (ApiMatch(ConfigHelper.GetAppSetting("IgnoreReturnDataFilter"),actionExecutedContext.Request.RequestUri.AbsolutePath)){result.Content = oldResponse.Content;}else{object content = null;var objectContent = oldResponse.Content as ObjectContent;if (objectContent != null){content = objectContent.Value;}//把action返回的值放到ReturnData的Result中result.Content =new ObjectContent<ReturnData>(new ReturnData {Msg = "成功", Ret = CustomException.NoneError, Result = content},_formatter);}actionExecutedContext.Response = result;}}/// <summary>/// API数据中的API是否匹配请求URIi/// </summary>/// <param name="apiArray">API数据</param>/// <param name="uri">请求URI</param>/// <returns>是否匹配</returns>private static bool ApiMatch(string apiArray, string uri){var result = false;if (!string.IsNullOrWhiteSpace(apiArray)){var apiList = apiArray.ToLower().Split(',');string uriLower = uri.ToLower();foreach (var api in apiList){if (api == uriLower || api + "/" == uriLower){result = true;break;}}}return result;}}
//返回数据过滤器config.Filters.Add(new ReturnDataFilterAttribute());

巧用ActionFilter的AOP特性,为返回的数据增加返回码和消息相关推荐

  1. spring boot 拦截器获取controller返回的数据_高级码农Spring Boot实战与进阶之过滤器和拦截器的使用及其区别...

    众所周知的Spring Boot是很优秀的框架,它的出现简化了新Spring应用的初始搭建以及开发过程,大大减少了代码量,目前已被大多数企业认可和使用.这个专栏将对Spring Boot框架从浅入深, ...

  2. java 返回值_Java方法返回值详解

    Java方法返回值详解 每个方法都是为了完成某个特定的功能,例如:登录功能.求和功能等,既然是功能,那么当这个功能完成之后,大多数情况下都会有一个结果的,比如,登录成功了或者失败了(true/fals ...

  3. python中接口测试垃圾数据如何清理_巧用PyUnit中unittest特性解决接口测试产生脏数据问题...

    巧用PyUnit中unittest特性解决接口测试产生脏数据问题 一.背景 测试数据创建后需要对其删除,不然可能产生脏数据,对开发和测试.生产环境造成一定影响.其接口框架是基于Python,API规范 ...

  4. Spring Boot AOP处理方法的入参和返回值

    前言 IOC和AOP是Spring 中最重要的两个模块.这里练习一下如何使用Spring Boot AOP处理方法的入参和返回值. Spring AOP的简单介绍: AOP(Aspect-Orient ...

  5. Aop做拦截器 获取请求头数据 修改请求数据拦截返回值修改返回值数据

    AOP 拦截器拦截请求头 修改请求参数 请求数据拦截 本页面 按住 ctrl 和 F 搜索 @Before("doPointcut()") 返回值数据拦截 本页面 按住 ctrl ...

  6. Qt 使用C++特性“引用” - 获得槽函数的返回值

    QT信号与槽中,槽函数是可以定义有返回值的,但是我们都是在connect函数中进行调用,那么该如何获得调用后的槽函数的返回值呢? 答案是不可能获得了的! 槽函数虽然可以定义返回值类型,但其实他和信号一 ...

  7. Struts2返回JSON数据的具体应用范…

    Struts2返回JSON数据的具体应用范例 博客分类: Struts2 Struts2JSON  早在我刚学Struts2之初的时候,就想写一篇文章来阐述Struts2如何返回JSON数据的原理和具 ...

  8. 从零开始学springboot笔记(二)-Spring boot返回json数据(中文无乱码)

    先创建json实体类,如下: public class Demo {private int age; private String address; private String name; priv ...

  9. 从源代码角度看Struts2返回JSON数据的原理

    2019独角兽企业重金招聘Python工程师标准>>> 前面一篇文章其实只是介绍了如何在Struts2中返回JSON数据到客户端的具体范例而无关其原理,内容与标题不符惹来标题党嫌疑确 ...

最新文章

  1. TCP释放连接的四次挥手过程
  2. JsonCpp的简单使用方法
  3. 网络编程学习笔记(获取所有网络接口)
  4. 【技术综述】深度学习在自然语言处理中的应用发展史
  5. BZOJ 3195: [Jxoi2012]奇怪的道路 | 状压DP
  6. github加速-解决GitHub访问速度很慢的问题
  7. Django出现UnicodeDecodeError: 'utf-8' codec can't decode byte 0xda in position 134: invalid
  8. Mysql group by 问题
  9. mysql判断是否为null_MySQL如何判断字段是否为null
  10. 计算机网络自顶向下-链路层
  11. Linux基础之-Bash命令优先级
  12. python调用go并把结果传回go_从Go调用Python函数并获取函数返回值
  13. mysql 遍历json数据结构,mysql存储过程中遍历json数据
  14. Android接入google地图
  15. 大数据平台任务调度与监控系统
  16. 【WLAN】【基础知识】WIFI那些事儿之Beamforming
  17. python抓取腾讯视频弹幕_Python实战 | 如何抓取腾讯视频弹幕
  18. 保险丝的作用,参数及选型应用,你真的懂了吗——电子元器件篇
  19. (大集合)Linux进程和线程的基本编程、通讯和例程【杂记】
  20. 取球游戏(C++)[堆]

热门文章

  1. 一款不错的网站压力测试工具webbench
  2. DB级buffer与IO 查看
  3. paip.C#.NET JSON解析总结
  4. 关于更换液晶屏(LCD)后“输入不支援”的一种解决方案
  5. python在运维自动化的前景_现在学运维自动化python和大数据?
  6. 无法访问你试图使用的功能所在的网络位置_[steam实用工具]解决无法访问商店/社区/好友列表的问题...
  7. SpringBoot+Mybatis 框架之 @SelectProvider注解方式搭建
  8. 【codevs1230】元素查找
  9. BZOJ3511: 土地划分
  10. 深入理解null的原理