iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么在ASP.NET中对不同类型的用户进行限流
  • 294
分享到

怎么在ASP.NET中对不同类型的用户进行限流

2023-06-06 11:06:41 294人浏览 独家记忆
摘要

本文章向大家介绍怎么在asp.net中对不同类型的用户进行限流,主要包括{**}的使用实例,应用技巧,基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。1、安装Nuget包已经发布到nuget.org,有多种安装方式

本文章向大家介绍怎么在asp.net中对不同类型的用户进行限流,主要包括{**}的使用实例,应用技巧,基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1、安装Nuget包

已经发布到nuget.org,有多种安装方式,选择自己喜欢的就行了。

包管理器命令:

Install-Package FireflySoft.RateLimit.Aspnetcore

或者.net命令:

dotnet add package FireflySoft.RateLimit.AspNetCore

或者项目文件直接添加:

<ItemGroup><PackageReference Include="FireflySoft.RateLimit.AspNetCore" Version="1.2.0" /></ItemGroup>

2、使用中间件

在Startup.Configure中使用中间件,演示代码如下(下边会有详细说明):

public void Configure(IApplicationBuilder app, IWEBHostEnvironment env){ ... app.UseRateLimit(new RateLimitProcessor<HttpContext>.Builder()  .WithAlGorithm(new FixedWindowAlgorithm<HttpContext>( new[] {   new FixedWindowRateLimitRule<HttpContext>()   {    Id = "1",    ExtractTarget = context =>    {     // 这里假设用户Id是从cookie中传过来的,需根据实际情况获取     return context.Request.GetTypedHeaders().Get<string>("userId");    },    CheckRuleMatching = context =>    {     // 这里假设用户类型是从cookie中传过来的,实际可能需要根据用户Id再去查询     // 0免费用户 1收费用户     int userType = context.Request.GetTypedHeaders().Get<int>("userType");     if(userType==0){      return true;     }     return false;    },    Name="免费用户限流规则",    LimitNumber=100,    StatWindow=TimeSpan.FromDays(1)   },   new FixedWindowRateLimitRule<HttpContext>()   {    Id = "2",    ExtractTarget = context =>    {     // 这里假设用户Id是从cookie中传过来的,需根据实际情况获取     return context.Request.GetTypedHeaders().Get<string>("userId");    },    CheckRuleMatching = context =>    {     // 这里假设用户类型是从cookie中传过来的,实际可能需要根据用户Id再去查询     // 0免费用户 1收费用户     int userType = context.Request.GetTypedHeaders().Get<int>("userType");     if(userType==1){      return true;     }     return false;    },    Name="收费用户限流规则",    LimitNumber=1000000,    StatWindow=TimeSpan.FromDays(1)   }  }))  .WithError(new Core.RateLimitError()  {   Code=429,   Message = "查询数达到当天最大限制"  })  //.WithStorage(new RedisStorage(StackExchange.Redis.ConnectionMultiplexer.Connect("localhost")))  .Build()); ...}

使用此中间件需要构建一个名为RateLimitProcessor的限流处理器实例,指定限流处理的请求类型HttpContext,设置限流处理的三个方面:

限流使用的算法以及对应的规则

限流算法,根据这个需求使用固定窗口算法就可以了,也称为计数器算法。此中间件还提供了滑动窗口算法、漏桶算法、令牌桶算法,可以根据需要选择。

不同的限流算法有不同的限流规则类型,在这里使用的是固定窗口限流规则,针对免费用户和收费用户分别定义了两个规则,注意其中的几个参数:

  • Id:在当前的版本中Id必须手动指定,并且不能重复。

  • ExtractTarget:传递一个方法用于从请求中提取限流目标,这里就是用户Id。

  • CheckRuleMatching传递一个方法用于检查当前请求是否适用当前规则,这里根据用户类型进行判断。

  • StatWindow是固定窗口的大小,是一个时间跨度,这里是1天。

  • LimitNumber是限流值,在StatWindow时间内请求数超过它就会触发限流。

这里有两个比较有意思的设置:ExtractTarget和CheckRuleMatching,他们共同作用,让用户可以完全自由的定制自己限流的目标和条件,无论是IP、ClientId或者Url。

限流统计数据的持久化方式

FireflySoft.RateLimit中的限流计数目前支持保存在内存或者Redis中,也可以通过实现IRateLimitStorage来定义一个新的存储器,不设置时默认为内存存储。

对于只需要部署一份的程序,绝大部分情况下使用内存就够了;但是如果限流的时间窗口比较长,比如1小时限制300次,重启就会丢失计数,这可能是个风险,此时使用Redis会比较合适。对于分布式应用,也建议使用Redis存储。

限流统计数据会根据限流时间窗口自动过期移除。

被限流时的错误码和消息

默认限流错误Code是429,这个会作为httpstatusCode返回;Message默认为null,你可以修改为自己的任意文字提示,这个会作为Http Body的内容返回。

以上就是使用FireflySoft.RateLimit.AspNetCore对不同类型的用户进行区别限流的使用方法。

如果觉得还是限制的有点死,比如返回错误信息部分,想返回一个JSON格式的错误消息,还可以使用FireflySoft.RateLimit.Core这个包来封装自己的ASP.net core中间件。

以上就是小编为大家带来的怎么在ASP.NET中对不同类型的用户进行限流的全部内容了,希望大家多多支持编程网!

--结束END--

本文标题: 怎么在ASP.NET中对不同类型的用户进行限流

本文链接: https://www.lsjlt.com/news/246640.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么在ASP.NET中对不同类型的用户进行限流
    本文章向大家介绍怎么在ASP.NET中对不同类型的用户进行限流,主要包括{**}的使用实例,应用技巧,基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。1、安装Nuget包已经发布到nuget.org,有多种安装方式...
    99+
    2023-06-06
  • 怎么在java中对对象的类型进行转换
    怎么在java中对对象的类型进行转换?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。对象类型转换分为向上转型和向下转型(强制对象转型)。 向上转型是子对象向父对象转型的过程,例如...
    99+
    2023-05-30
    java
  • 在java中怎么对数据类型进行进制转换
    在java中怎么对数据类型进行进制转换?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在java中Int 类型的变量占 4个字节Long 类型的变量占8个字节一个程序就是一个...
    99+
    2023-05-31
    java ava 数据类
  • 怎么在C++链表中链入不同类型对象
    这篇文章主要介绍“怎么在C++链表中链入不同类型对象”,在日常操作中,相信很多人在怎么在C++链表中链入不同类型对象问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么在C++链表中链入不同类型对象”的疑惑有所...
    99+
    2023-06-17
  • 怎么在golang中利用Cast组件对类型进行转换
    这篇文章主要为大家详细介绍了怎么在golang中利用Cast组件对类型进行转换,文中示例代码介绍的非常详细,具有一定的参考价值,发现的小伙伴们可以参考一下:什么是golanggolang 是Google开发的一种静态强类型、编译型、并发型,...
    99+
    2023-06-06
  • 如何在 ASP 对象中使用不同的数据类型?
    ASP(Active Server Pages)是一种服务端脚本语言,常用于创建动态的网页。在ASP中,我们经常需要使用不同的数据类型来进行数据的存储和处理。本文将介绍如何在ASP对象中使用不同的数据类型。 一、字符串类型 字符串类型是AS...
    99+
    2023-07-29
    对象 数据类型 leetcode
  • 怎么在Java中对TreeSet进行自定义类型的排序
    怎么在Java中对TreeSet进行自定义类型的排序?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java可以用来干什么Java主要应用于:1. web开发;2. Androi...
    99+
    2023-06-06
  • Java怎么使用Semaphore对单接口进行限流
    这篇文章主要讲解了“Java怎么使用Semaphore对单接口进行限流”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java怎么使用Semaphore对单接口进行限流”吧!目录一、实战说明1...
    99+
    2023-06-20
  • 怎么在PHP中进行类型比较
    这篇文章主要介绍“怎么在PHP中进行类型比较”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么在PHP中进行类型比较”文章能帮助大家解决问题。1.比较整数在PHP中,可以使用以下比较运算符比较整数:...
    99+
    2023-07-05
  • 怎么在JavaScript中进行类型判断
    这期内容当中小编将会给大家带来有关怎么在JavaScript中进行类型判断,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。JavaScript的作用是什么1、能够嵌入动态文本于HTML页面。2、对浏览器事件...
    99+
    2023-06-14
  • 如何在 LeetCode 中使用 ASP 对象的不同数据类型?
    LeetCode 是一个非常受欢迎的面试准备平台,它提供了许多算法和数据结构的练习题目,以帮助开发人员提高自己的编程技能。在 LeetCode 上使用不同的数据类型是非常常见的,本文将介绍如何使用 ASP 对象中的不同数据类型。 ASP 对...
    99+
    2023-07-29
    对象 数据类型 leetcode
  • 怎么在python中接收不同类型的参数
    本篇文章为大家展示了怎么在python中接收不同类型的参数,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬...
    99+
    2023-06-14
  • C# 中怎么对数据类型进行转换
    本篇文章给大家分享的是有关C# 中怎么对数据类型进行转换,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、函数方法下面罗列的函数方法不是全部,仅列举一些常用的double这种有...
    99+
    2023-06-20
  • SpringBoot中使用Redis对接口进行限流的实现
    目录实现的思路 使用 Hash 存储接口的限流配置 使用普通kv,存储api的请求次数 使用SpringBoot实现 RedisKeys ObjectRedisTemplate Re...
    99+
    2024-04-02
  • 怎么在Android中利用ClassLoader对类进行加载
    本篇文章给大家分享的是有关怎么在Android中利用ClassLoader对类进行加载,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java的类加载设计了一套双亲代理的模式,使...
    99+
    2023-05-31
    classloader android roi
  • C#怎么使用泛型集合存储不同类型的对象
    在C#中,您可以使用泛型集合来存储不同类型的对象。为此,您可以使用泛型类List或Dictionary<TKey, TValu...
    99+
    2024-04-09
    C#
  • 在CSS中不同类型的列表项怎么标记
    今天小编给大家分享一下在CSS中不同类型的列表项怎么标记的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来...
    99+
    2024-04-02
  • 怎么在python中使用read读取不同类型的文件
    这篇文章将为大家详细讲解有关怎么在python中使用read读取不同类型的文件,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python是什么意思Python是一种跨平台的、具有解释性、编译...
    99+
    2023-06-14
  • 怎么在Oracle中对用户中表的数据量进行统计
    怎么在Oracle中对用户中表的数据量进行统计?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。要想统计用户下所有表的数据量,可以查看user_t...
    99+
    2024-04-02
  • 怎么在Java中利用Kafka对客户端进行访问
    这篇文章给大家介绍怎么在Java中利用Kafka对客户端进行访问,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1. maven依赖包<dependency> <groupId>org.apac...
    99+
    2023-05-31
    kafka java ava
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作