C#中如何运用Filter过滤器

场景:需要记录日志、权限验证、异常捕获,如果让代码不再重复编写

代码封装:

 public class MyActionFilterAttribute : ActionFilterAttribute
    {
        /// <summary>
        /// 执行前
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);

            var guid = Guid.NewGuid().ToString();

            string controllerName = (string)filterContext.RouteData.Values["controller"];
            string actionName = (string)filterContext.RouteData.Values["action"];
            var request = string.Empty;
            if (filterContext.ActionParameters.Any())
            {
                request = JsonConvert.SerializeObject(filterContext.ActionParameters);
            }
            //logStr.AppendFormat("请求参数:{0}", JsonConvert.SerializeObject(request)); // 记录请求日志
            //LogService.WriteNormalLog(actionName, request, "", $"{controllerName}/{actionName}", LogCategory.GetRequest.GetEnumDesc(), filter1: TraceId);
        }
        /// <summary>
        /// 执行后
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            base.OnActionExecuted(filterContext);

            string controllerName = (string)filterContext.RouteData.Values["controller"];
            string actionName = (string)filterContext.RouteData.Values["action"];

            var request = string.Empty;
            if (filterContext.ActionDescriptor.GetParameters() != null && filterContext.ActionDescriptor.GetParameters().Length > 0)
            {
                request = JsonConvert.SerializeObject(filterContext.ActionDescriptor.GetParameters());
            }

            var response = string.Empty;
            response = JsonConvert.SerializeObject(filterContext.Result);
            //logStr.AppendFormat("返回参数:{0}", JsonConvert.SerializeObject(response)); // 记录返回日志
            //LogService.WriteNormalLog(actionName, request, response, $"{controllerName}/{actionName}", LogCategory.GetResponse.GetEnumDesc(), filter1: TraceId);
        }

        /// <summary>
        /// 在执行操作结果后
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            base.OnResultExecuted(filterContext);

            //TODO 自己的事
        }

        /// <summary>
        /// 在执行操作结果之前
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            base.OnResultExecuting(filterContext);

            //TODO 自己的事
        }
    }
 /// <summary>
    /// 登录权限验证
    /// </summary>
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
    public class AuthorizeFilterAttribute : AuthorizeAttribute
    {
        /// <summary>验证登录</summary>
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            if (filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true)
             || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true))
            {
                return;//无需验证登录
            }
            var token = filterContext.HttpContext.Request.Cookies["CookieName"];
            if (string.IsNullOrEmpty(token.Value))
            {
                return;
            }
            //var returnUri = filterContext.HttpContext.Request.Url.ToString();

            if (filterContext.HttpContext.Request.UrlReferrer != null)
            {
                filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.Forbidden;
                filterContext.HttpContext.Response.AddHeader("url", "自定义链接");
                filterContext.Result = new ContentResult();
            }
            else
            {
                filterContext.Result = new RedirectResult("自定义链接");
            }

        }
    }
/// <summary>
    /// 异常处理
    /// </summary>
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
    public class ExceptionFilterAttribute : HandleErrorAttribute
    {
        /// <summary>
        ///在发生异常时调用
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnException(ExceptionContext filterContext)
        {
            if (!filterContext.ExceptionHandled)//异常有没有被处理过
            {
                string controllerName = (string)filterContext.RouteData.Values["controller"];
                string actionName = (string)filterContext.RouteData.Values["action"];
                Exception ex = filterContext.Exception;

                //记录日志
                //WriteLog(logStr.ToString()) 

                var result = new BaseResultMessage()
                {
                    ResultCode = ResultCodeEnum.Exception.GetHashCode(),
                    ResultMsg = filterContext.Exception.Message
                };

                filterContext.Result = new ContentResult()
                {
                    Content = JsonConvert.SerializeObject(result)//这个就是返回的结果
                };
                filterContext.ExceptionHandled = true;
            }
        }
    }

代码使用端:

 /// <summary>
    /// 接口案例
    /// </summary>
    [MyActionFilter]
    [ExceptionFilter]
    [AuthorizeFilter]
    public class FilterDemoController : BaseApiController
    {
        /// <summary>
        /// AllowAnonymous代表不验证权限
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        [AllowAnonymous]
        [HttpPost]
        public ResultMessage<int> AddStudent(AddStudentRequest request)
        {
            return null;
        }

        [HttpPost]
        public ResultMessage<StudentEntity> GetStudent(FindStudentRequest request)
        {
            return null;
        }
    }

 

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值