栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

.Net Core WebApi 系列:过滤器Filter

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

.Net Core WebApi 系列:过滤器Filter

过滤器有什么作用,在什么场景下适合用到它?

假设一个项目进展到快结束的时候,项目leader为了保证程序的稳定性和可监控和维护性要求将所有的方法加上日志,如果项目比较庞大,方法非常多,那岂不是得费很大得劲来完成这样一件事情。不过不用担心,咋们遇到的问题,伟大的语言设计者早已帮我们想好了解决办法过滤器,过滤器是一种AOP(面向切面编程)技术的体现,AOP具有松耦合,易扩展,代码可复用的特点。

通常我们在这些场景下如身份验证、日志记录、异常获取等会使用到过滤器

.NET Core中的过滤器生命周期:

 

 

.NET Core中的过滤器有多种,先介绍ActionFilterAttribute的用法

(1)自定义一个Filter类:

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Threading.Tasks;

namespace Test.WebApi.Filter
{
    public class ClientIpCheckActionFilter : ActionFilterAttribute
    {
       
        private readonly string _safelist;

        public ClientIpCheckActionFilter(string safelist)
        {
            _safelist = safelist;           
        }

        public override void OnActionExecuting(ActionExecutingContext context)
        {
            var remoteIp = context.HttpContext.Connection.RemoteIpAddress;
            LogHelper.Debug("Remote IpAddress: {"+ remoteIp + "}");
            var ip = _safelist.Split(';');
            var badIp = true;

            if (remoteIp.IsIPv4MappedToIPv6)
            {
                remoteIp = remoteIp.MapToIPv4();
            }

            foreach (var address in ip)
            {
                var testIp = IPAddress.Parse(address);

                if (testIp.Equals(remoteIp))
                {
                    badIp = false;
                    break;
                }
            }

            if (badIp)
            {
                LogHelper.Debug("Forbidden Request from IP: {"+ remoteIp + "}");
                context.Result = new StatusCodeResult(StatusCodes.Status403Forbidden);
                return;
            }

            base.OnActionExecuting(context);
        }


    }
}

 (2)注册过滤器,注册过滤器有两种方式,一种是全局注册,另一种是局部注册:

  public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();

            // If using Kestrel:
            //services.Configure(options =>
            //{
            //    options.AllowSynchronousIO = true;
            //});

            // If using IIS:
            services.Configure(options =>
            {
                options.AllowSynchronousIO = true;
            });
            // 全局注册 在ConfigureServices 添加
            services.AddMvc(option => { option.Filters.Add(typeof(ClientIpCheckActionFilter)); });         
            
           
        }

局部注册,局部注册可以体现在类或方法上:

//[Route("api/[controller]")]
    //[ApiController]
    [ClientIpCheckFilter]
    public class ContractController : ControllerBase
    {
        public IConfiguration Configuration { get; }
        public ContractController(IConfiguration _configuration)
        {
            Configuration = _configuration;
        }

        // GET: api/
        [HttpGet]
        [ClientIpCheckFilter]
        public IEnumerable Get()
        {
            return new string[] { "value1", "value2" };
        }
    }

参考:

.NET Core中过滤器Filter的使用介绍 - 星火卓越 - 博客园过滤器有什么作用,在什么场景下适合用到它? 假设一个项目进展到快结束的时候,项目leader为了保证程序的稳定性和可监控和维护性要求将所有的方法加上日志,如果项目比较庞大,方法非常多,那岂不是得费很大https://www.cnblogs.com/amylis_chen/p/12318081.html

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1023024.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号