当前位置:   article > 正文

过滤器 -- Filter

过滤器 -- 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."
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
  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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
  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.");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
  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;
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/625192
推荐阅读
相关标签
  

闽ICP备14008679号