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

背景

对于处理接口返回值统一加密,过滤,特定值统一处理,统一返回等多种需求,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());

后端Q

生命不止 代码不止

168篇原创内容

公众号

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值