ASP.NET CORE 6.0实现Filter过滤器

一、什么是Filter

ASP.NET Core 中,Filter 是一种用于处理 HTTP 请求和响应的机制,它可以让你在请求和响应的不同阶段添加额外的逻辑。Filter 在 MVC(Model-View-Controller)和 Web API 应用程序中起着重要作用,可以帮助你实现诸如身份验证、授权、日志记录、异常处理等功能。

二、 创建自定义的 Action Filter
    /// <summary>
    /// 自定义的 Action Filter,用于在动作方法执行前后记录日志
    /// </summary>
    public class CustomActionFilter : ActionFilterAttribute
    {
        private static readonly ILog log = LogManager.GetLogger(typeof(CustomActionFilter));

        /// <summary>
        /// Id
        /// </summary>
        private string SysId { get; set; }

        /// <summary>
        /// 密钥
        /// </summary>
        private string SysSecret { get; set; }

        /// <summary>
        /// 构造函数,接收系统Id和密钥
        /// </summary>
        /// <param name="sysId"></param>
        /// <param name="sysSecret"></param>
        public CustomActionFilter(string sysId, string sysSecret)
        {
            this.SysId = sysId;
            this.SysSecret = sysSecret;
        }

        /// <summary>
        /// Action执行前的逻辑
        /// </summary>
        /// <param name="context"></param>
        /// <param name="next"></param>
        /// <returns></returns>
        public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            log.Info("Action执行前...");
            var request = context.HttpContext.Request;
            string sysId = GetRequestValue(context, SysId);
            string sysSecret = GetRequestValue(context, SysSecret);
            if (string.IsNullOrEmpty(sysId) || string.IsNullOrEmpty(sysSecret))
            {
                //context.Result = new UnauthorizedObjectResult("签名无效!");
                //return;
            }

            #region sysId 和 sysSecret 都不为空的情况下执行的操作(建议这存储到数据库)

            // 执行并记录日志
            FilterLog filterLog = new FilterLog()
            {
                Name = context.Controller.GetType().Name,
                RequestUrl = GetUrl(request),
                RequestMethod = request.Method,
                RequestBody = await GetBodyAsStringAsync(request),
                RequestTime = DateTime.Now,
                RequestIpAddress = context.HttpContext.Connection.RemoteIpAddress?.ToString(),
            };
            string json = JsonConvert.SerializeObject(filterLog);
         
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值