过滤器 -- Filter

  1. ActionFilterAttribute:
    示例:实现一个日志记录过滤器,记录每个控制器动作方法的执行时间和参数信息。

    public class LogActionFilterAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            // 记录方法开始执行时间和参数信息
            context.HttpContext.Items["StartTime"] = DateTime.Now;
            LogParameters(context.ActionArguments);
        }
    
        public override void OnActionExecuted(ActionExecutedContext context)
        {
            // 记录方法执行结束时间和耗时
            var startTime = (DateTime)context.HttpContext.Items["StartTime"];
            var duration = DateTime.Now - startTime;
            LogDuration(duration);
        }
    
        private void LogParameters(IDictionary<string, object> parameters)
        {
            // 将参数信息记录到日志中
            foreach (var param in parameters)
            {
                // 记录参数名称和值
            }
        }
    
        private void LogDuration(TimeSpan duration)
        {
            // 将方法执行时间记录到日志中
            // 例如: "Method executed in {duration.TotalMilliseconds} ms."
        }
    }
    
  2. AuthorizeAttribute:
    示例:实现一个基于角色的授权过滤器,只允许具有特定角色的用户访问某个控制器动作方法。

    public class RoleAuthorizeAttribute : AuthorizeAttribute
    {
        private readonly string[] _allowedRoles;
    
        public RoleAuthorizeAttribute(params string[] allowedRoles)
        {
            _allowedRoles = allowedRoles;
        }
    
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            // 获取当前用户的角色信息
            var user = httpContext.User;
            if (user.Identity.IsAuthenticated)
            {
                // 检查用户是否具有允许的角色
                return _allowedRoles.Any(role => user.IsInRole(role));
            }
            return false;
        }
    }
    
  3. ExceptionFilterAttribute:
    示例:实现一个全局异常处理过滤器,将所有未处理的异常记录到日志中,并返回友好的错误页面。

    public class GlobalExceptionFilter : ExceptionFilterAttribute
    {
        public override void OnException(ExceptionContext context)
        {
            // 记录异常信息到日志中
            LogException(context.Exception);
    
            // 设置响应状态码为500 Internal Server Error
            context.HttpContext.Response.StatusCode = 500;
    
            // 设置视图名称为"Error"
            context.Result = new ViewResult { ViewName = "Error" };
    
            // 将异常信息传递给视图
            ((ViewResult)context.Result).ViewData["Exception"] = context.Exception;
    
            // 标记异常已被处理
            context.ExceptionHandled = true;
        }
    
        private void LogException(Exception exception)
        {
            // 将异常信息记录到日志中
            // 例如: logger.LogError(exception, "An unhandled exception occurred.");
        }
    }
    
  4. ResultFilterAttribute:
    示例:实现一个 JSON 格式化过滤器,将控制器动作方法的返回值自动序列化为 JSON 格式。

    public class JsonResultFilterAttribute : ResultFilterAttribute
    {
        public override void OnResultExecuting(ResultExecutingContext context)
        {
            // 检查返回值是否为 JsonResult 类型
            if (context.Result is JsonResult jsonResult)
            {
                // 将返回值序列化为 JSON 格式
                var json = JsonConvert.SerializeObject(jsonResult.Value);
    
                // 设置响应内容类型为 application/json
                context.HttpContext.Response.ContentType = "application/json";
    
                // 将 JSON 字符串写入响应
                context.HttpContext.Response.WriteAsync(json);
    
                // 标记结果已被处理
                context.Cancel = true;
            }
        }
    }
    

其他过滤器的使用示例可以参考官方文档或其他相关资料。总的来说,这些过滤器可以帮助开发者在 Web 应用程序中实现各种横切关注点,提高代码的可重用性和可维护性。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值