.Net Core WebApi 系列:过滤器Filter

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

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

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

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

 

.Net Core WebApi 系列:过滤器Filter_第1张图片

 

.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

你可能感兴趣的:(C#,.netcore,microsoft)