首页 > 其他分享 >.NET Core:中间件系列(三):中间件限流

.NET Core:中间件系列(三):中间件限流

时间:2022-08-18 16:59:46浏览次数:100  
标签:Core memCache 中间件 Headers 限流 ToString context public

中间件

微软官网定义: 中间件
中间件意思就是处理请求和响应的软件:
1、选择是否将请求传递到管道中的下一个组件。
2、可在管道中的下一个组件前后执行工作。
对中间件类 必须 包括以下
具有类型为 RequestDelegate 的参数的公共构造函数。
名为 Invoke 或 InvokeAsync 的公共方法。
此方法必须:返回 Task。
接受类型 HttpContext 的第一个参数。

Use

Run

Demo

    public class UserVerifyMiddleware
    {
        private readonly RequestDelegate _next;
        private readonly IMemoryCache _memCache;
        private readonly ILogger<UserVerifyMiddleware> _logger;
        public UserVerifyMiddleware(RequestDelegate next
            , ILogger<UserVerifyMiddleware> logger, IMemoryCache memCache)
        {
            _next = next;
            _logger = logger;
            _memCache = memCache;
        }

        public async Task Invoke(HttpContext context)
        {
            var request_ip = string.IsNullOrEmpty(context.Request.Headers["X-Real-IP"].ToString()) ? context.Connection.RemoteIpAddress.MapToIPv4().ToString() : context.Request.Headers["X-Real-IP"].ToString();
            var request_ForwardIp = string.IsNullOrEmpty(context.Request.Headers["X-Forwarded-For"].ToString()) ? context.Connection.RemoteIpAddress.MapToIPv4().ToString() : context.Request.Headers["X-Forwarded-For"].ToString();
            var Referer = context.Request.Headers["Referer"].ToString();

            try
            {
                if (!string.IsNullOrWhiteSpace(_memCache.Get<long?>(request_ForwardIp).ToString()))
                {
                    context.Response.StatusCode = 200;
                    context.Response.ContentType = "application/json; charset=utf-8";
                    var data = JsonConvert.SerializeObject(new ResponseValue()
                    {
                        Code = 400,
                        ErrorMsg = "Illegal access. Your IP ({" + request_ip + "}) has been recorded, if any questions, please contact us."
                    });
                    await context.Response.WriteAsync(data);
                }
                else
                {
                    _memCache.Set(request_ForwardIp, Environment.TickCount64, TimeSpan.FromSeconds(2));
                    await _next(context);
                }

            }
            catch (Exception ex)
            {
                context.Response.StatusCode = 400;
                await context.Response.WriteAsync("你的请求太频繁了");
            }
            // 
        }
    }
    public static class UserVerifyMiddlewareExtensions
    {
        public static IApplicationBuilder UserVerifyMiddleware(this IApplicationBuilder builder)
        {
            //使用 IApplicationBuilder 公开中间件
            return builder.UseMiddleware<UserVerifyMiddleware>();
        }
    }

标签:Core,memCache,中间件,Headers,限流,ToString,context,public
From: https://www.cnblogs.com/Bo-H/p/16599259.html

相关文章

  • .Net core 利用Npoi.Mapper 生成Excel
    1.NuGet添加Npoi.Mapper引用   2.初始化privatevoidbutton1_Click(objectsender,EventArgse){//数据导出测试......
  • 【CV项目源码实现】Floating point exception (core dumped)
    前言cmd./darknetdetectordemocfg/tfl.datacfg/yolov3-tiny-tfl.cfgbackup/yolov3-tiny-tfl_500000.weightsdata/tfl.avierrorFloatingpointexception(cor......
  • 中间件MyCAT分库分表
    一、原理Mycat的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的SQL语句,首先对SQL语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等......
  • 中间件tomcat
    1.什么是中间件中间件(英语:Middleware):是系统软件和应用软件之间连接的软件,以便于软件各部件之间的沟通,特别是应用软件对于系统软件的集中的逻辑,是一种独立的系统软件或服务......
  • AI Engine core 初识
    AIEnginecore初识     其余的端口需要通过软件平台来使能  ......
  • ASP.NET Core依赖注入系统学习教程:5.生命周期
    在现实生活中,生命周期一词往往代表着某些人或事物从生到死的过程,而在依赖注入框架中,生命周期中的“生与死”体现为服务实例的创建和释放。实际上对于介绍依赖注入框架的生......
  • redux中间件
    什么是中间件?中间件就是一个函数,对store.dispatch方法进行了改造,在发出Action和执行Reducer这两步之间,添加了其他功能。为什么要使用中间件?redux基础用法:用户发出Ac......
  • .net core 6.0 应用session
    一、在Strartup类的ConfigureServices方法中添加:services.AddDistributedMemoryCache(); //添加内存缓存services.AddSession(); //添加Session服务 二、在Strartu......
  • SpringBoot连接redis报错:exception is io.lettuce.core.RedisException: java.io.IOE
    一、解决思路(1).检查redis的配置是否正确springredis:host:localhostport:6379password:123456database:0......
  • 解决ASP.NET Core在Task中使用IServiceProvider的问题
    前言#    问题的起因是在帮同事解决遇到的一个问题,他的本意是在EFCore中为了解决避免多个线程使用同一个DbContext实例的问题。但是由于对Microsoft.Extensions.Dep......