面向云技术架构 - 痴者工良

  • 首页
  • 工良写的电子书
    • kubernetes 教程
    • 从 C# 入门 Kafka
    • 多线程和异步
    • 动态编程-反射、特性、AOP
    • 表达式树
  • 本站文章导航
  • 隐私政策
愿有人陪你颠沛流离
遇到能让你付出的事物或者人,都是一种运气。
能遇到,就该珍惜。或许你们最终没能在一起,但你会切实地感受到力量。
正因为这样,那段相遇才变得有价值,才没有辜负这世间的每一段相遇。
  1. 首页
  2. .NET
  3. 正文

ASP.NET Core 常用拦截器、过滤器

2021年8月12日 1346点热度 0人点赞 0条评论
内容纲要

全局异常拦截器:

    /// <summary>
    /// Web 全局异常过滤器,处理 Web 中出现的、运行时未处理的异常
    /// </summary>
    public class WebGlobalExceptionFilter : IAsyncExceptionFilter
    {
        private readonly ILogger _logger;

        /// <summary>
        /// 
        /// </summary>
        /// <param name="loggerFactory"></param>
        public WebGlobalExceptionFilter(ILoggerFactory loggerFactory)
        {
            _logger = loggerFactory.CreateLogger<WebGlobalExceptionFilter>();
        }

        // json 序列化配置
        private static readonly JsonSerializerOptions JsonSetting = new JsonSerializerOptions()
        {
            PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
            WriteIndented = true
        };

        /// <summary>
        /// 异常处理
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public async Task OnExceptionAsync(ExceptionContext context)
        {
            // 未经处理的异常
            if (!context.ExceptionHandled)
            {
                _logger.LogCritical(context.Exception, context.ActionDescriptor.DisplayName);
                var response = new ResponseJsonResultModel<object>()
                {
                    Code = (int)HttpStateCode.InternalServerError,
                    Msg = ResponseCode.SystemErrorValue,
                };

                context.Result = new ContentResult
                {
                    Content = JsonSerializer.Serialize(response, JsonSetting),
                    StatusCode = (int)HttpStateCode.InternalServerError,
                    ContentType = "application/json; charset=utf-8"
                };

                context.ExceptionHandled = true;
            }
            else
            {
                _logger.LogError(context.Exception, context.ActionDescriptor.DisplayName);
            }

            await Task.CompletedTask;
        }
    }

统一资源拦截器:


    /// <summary>
    /// 请求过滤验证,例如 400,405,415 等没带参数、metadate type 错误等
    /// </summary>
    public partial class ResourceFilter : IResourceFilter
    {
        private readonly ILogger _logger;

        /// <summary>
        /// 
        /// </summary>
        /// <param name="loggerFactory"></param>
        public ResourceFilter(ILoggerFactory loggerFactory)
        {
            _logger = loggerFactory.CreateLogger<WebGlobalExceptionFilter>();
        }

        /// <summary>
        /// 请求时
        /// </summary>
        /// <param name="context"></param>
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
        }

        /// <summary>
        /// 请求后
        /// </summary>
        /// <param name="context"></param>
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            // 验证通过
            if (context.ModelState.IsValid)
            {
                return;
            }

            int count = context.ModelState.Count;
            ValidationErrors[] errors = new ValidationErrors[count];
            int i = 0;
            foreach (var item in context.ModelState)
            {
                errors[i] = new ValidationErrors
                {
                    Member = item.Key,
                    Messages = item.Value.Errors?.Select(x => x.ErrorMessage).ToArray()
                };
                i++;
            }

            // 响应消息
            var result = new ResponseJsonResultModel<ValidationErrors[]>()
            {
                Code = (int)HttpStateCode.BadRequest,
                Msg = "请求格式不正确",
                Data = errors
            };

            _logger.LogDebug(System.Text.Json.JsonSerializer.Serialize(result));

            var objectResult = new BadRequestObjectResult(result);
            objectResult.StatusCode = (int)HttpStateCode.BadRequest;
            context.Result = objectResult;
        }
    }

统一模型验证器:

    /// <summary>
    /// 统一 Action 模型验证过滤器
    /// </summary>
    public class ActionInvalidModelFilter : IAsyncActionFilter
    {
        /// <summary>
        /// 拦截器
        /// </summary>
        /// <param name="context"></param>
        /// <param name="next"></param>
        /// <returns></returns>
        public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            // 验证通过
            if (context.ModelState.IsValid)
            {
                await next();
                return;
            }

            int count = context.ModelState.Count;
            ValidationErrors[] errors = new ValidationErrors[count];
            int i = 0;
            foreach (var item in context.ModelState)
            {
                errors[i] = new ValidationErrors
                {
                    Member = item.Key,
                    Messages = item.Value.Errors?.Select(x => x.ErrorMessage).ToArray()
                };
                i++;
            }

            // 响应消息
            var result = new ResponseJsonResultModel<ValidationErrors[]>()
            {
                Code = (int)HttpStateCode.BadRequest,
                Msg = "请求参数不正确",
                Data = errors
            };

            var objectResult = new BadRequestObjectResult(result);
            objectResult.StatusCode = (int)HttpStateCode.BadRequest;
            context.Result = objectResult;
            await Task.CompletedTask;
        }
    }
```'

在进行依赖注入的时候,添加进去:
```csharp
            // 过滤器
            services.AddControllers(options =>
            {
                options.Filters.Add<WebGlobalExceptionFilter>();
                options.Filters.Add<ActionInvalidModelFilter>();
                options.Filters.Add<ResourceFilter>();
            })
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: asp core net 拦截器 过滤器
最后更新:2021年8月12日

痴者工良

高级程序员劝退师

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

COPYRIGHT © 2022 whuanle.cn. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

粤ICP备18051778号

粤公网安备 44030902003257号