如何在 Asp.Net Core 中对请求进行限流

译文链接:https://www.infoworld.com/article/3442946/how-to-implement-rate-limiting-in-aspnet-core.html

在应用程序开发时,或许你有这样的想法,控制用户的请求频率来防止一些用户的恶意攻击,具体的说就是:为了预防有名的 拒绝服务 攻击,限制某一个ip在一段时间内的访问次数,要解决这个问题,就要用到限流机制。

限流能够很好的控制住一个客户端访问服务器资源地址的请求次数,在 asp.net core 之前,要实现限流机制,你可能要自定义 module 或者 handler,太繁琐了,不过很开心的是,在 asp.net core 里,可以很轻松的实现限流功能,这得益于 asp.net core 特有的 pipeline 机制,接下来,我们一起研究一下如何在 asp.net core 中实现限流机制。

安装 限流中间件

为了能够实现限流功能,可以使用第三方提供的限流中间件,利用这个中间件给多个场景进行限流,比如:允许某一个 ip 或者 ip段 在指定的时间周期内访问某一个资源的次数,这个周期可以是:每秒,每分钟,每 n 分钟,等等。

在 Visual Studio 中创建好 ASP.NET Core API 之后,下一步就是安装 限流包 AspNetCoreRateLimit,你可以在 NuGet Package Manager 可视化工具上安装,也可以在 .NET CLI 命令行中安装,语句如下:


dotnet add package AspNetCoreRateLimit

如果想了解限流包 AspNetCoreRateLimit  的更多知识,参考 github:https://github.com/stefanprodan/AspNetCoreRateLimit

配置 AspNetCoreRateLimit

现在 AspNetCoreRateLimit 已经引用到我们项目中了,接下来在 ConfigureServices 方法中追加如下代码,最终将请求追加到 request-response pipeline 管道中。

public class Startup{// This method gets called by the runtime. Use this method to add services to the container.public void ConfigureServices(IServiceCollection services){services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);services.AddOptions();services.AddMemoryCache();services.Configure<IpRateLimitOptions>(Configuration.GetSection("IpRateLimit"));services.AddSingleton<IIpPolicyStore,MemoryCacheIpPolicyStore>();services.AddSingleton<IRateLimitCounterStore,MemoryCacheRateLimitCounterStore>();services.AddSingleton<IRateLimitConfiguration,RateLimitConfiguration>();services.AddHttpContextAccessor();}}

上面代码 Configuration.GetSection("IpRateLimit") 需要注意一下, 节点 IpRateLimit 的具体限流信息是配在 appsettings.json 中的。

接下来在 Configure 方法中使用限流中间件。

public class Startup{// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.public void Configure(IApplicationBuilder app, IWebHostEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseRouting();app.UseIpRateLimiting();app.UseAuthorization();app.UseEndpoints(endpoints =>{endpoints.MapControllers();});}}

最后再来看一下 appsettings.json 文件,着重看一下 限流规则 是怎么配置的,可以看出一个限流规则是由 端点 + 周期 + 次数 3个元素组成的,完整的 appsettings.json 配置如下:


{"Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"}},"AllowedHosts": "*","IpRateLimit": {"EnableEndpointRateLimiting": true,"StackBlockedRequests": false,"RealIPHeader": "X-Real-IP","ClientIdHeader": "X-ClientId","HttpStatusCode": 429,"GeneralRules": [{"Endpoint": "*/weatherforecast","Period": "1m","Limit": 5}]}
}

上面的限流规则可以确保:含有 "/api" 的 url 链接在任何分钟周期内最多有5次访问。

测试 AspNetCoreRateLimit

下面就可以按下 Ctrl + F5 把应用程序跑起来,默认情况下请求会访问 ValueController 的 Get 方法,然后刷新页面5次,会看到页面出现如下信息。

因为是演示目的,所以这里我配置成了5次,实际开发中,大家可以根据项目的具体情况来设置这个限流阈值,当然更灵活的做法就是将 限流次数 保存在 数据库 或者缓存中,这样可以在程序运行过程中动态的修改这个阈值,太强大了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306573.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法设计与分析——动态规划——石子合并问题

1.石子合并问题 在一个圆形操场的四周摆放着n堆石子。现要将石子有序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆&#xff0c;并将新的一堆石子数记为该次合并的得分。设计一个算法&#xff0c;计算出将n堆石子合并成一堆的最小得分和最大得分。 #include<st…

软件层面可以做到重启本地串口吗_手机关机还是重启好?get这几招,手机更流畅...

遇到手机卡顿&#xff0c;很多人都会不自觉的选择重启手机&#xff0c;还是不行&#xff0c;就关机等一会儿再开机&#xff0c;这样几次下来手机真的就顺畅多了。那么关机和重启到底有什么区别&#xff1f;还有哪些方法可以保持手机流畅&#xff1f;跟着小编来了解一下&#xf…

在传统行业做数字化转型之团队篇

【数字化转型】| 作者 / Edison Zhou这是EdisonTalk的第309篇原创内容在过去的两年时间里&#xff0c;我加入了一家传统行业的企业参与其数字化转型的过程&#xff0c;现在我将我的经历分享出来&#xff0c;本文是第四部分—团队篇&#xff0c;主要会介绍一下我所在的经济适用型…

回顾 | 进击吧! Blazor!系列

Blazor 是一个 Web UI 框架&#xff0c;可通过 WebAssembly 在任意浏览器中运行 .Net 。Blazor 旨在简化快速的单页面 .Net 浏览器应用的构建过程&#xff0c;它虽然使用了诸如 CSS 和 HTML 之类的 Web 技术&#xff0c;但它使用 C&#xff03;语言和 Razor 语法代替 JavaScrip…

算法设计与分析——回溯法——旅行售货员问题

#include<iostream> #include<bits/stdc.h> using namespace std; const int noEdge65535; class Traveling {public:void BackTrack(int i);int n; //图G的顶点数 int *x; //当前的解 int *bestx; // 当前的最优解 int **a; // 图G的临界矩阵 int cc; //…

sql不等于0怎么表示_数组真的只能从0开始吗?python表示不同意

背景早在linux操作系统诞生开始&#xff0c;c语言作为linux系统的编程语言主力&#xff0c;它为后续的其他高级编程语言(如c、java)提供了很多语言级的语义和协议规范。数组做为linux操作系统最基本的数据结构之一&#xff0c;便是其中的一项语言级高级特性&#xff0c;深入理解…

ASP.NET Core 5.0新增功能摘要

.NET5.0发布了大半个月&#xff0c;从.NET Core3.1的平滑迁移体验令人心旷神怡&#xff0c;改个targetframework就完成迁移&#xff0c;不要太轻松&#xff01;然而&#xff0c;ASP.NET Core5.0也有很多有意思的改变&#xff0c;这里为大家摘录一下&#xff01;内置swagger在 A…

算法设计与分析——回溯法——圆排列问题

#include<iostream> #include<math.h> using namespace std; class Circle {public:float Center(int t);void Compute(void );void BackTrack(int t);float min; //当前最优值 float *x; //当前圆排列圆心横坐标 float *r; //当前圆排列 float *result; /…

数字图像处理王伟强_深度学习主导下,还有必要学数字图像处理?

图像处理技术作为计算机视觉的基础&#xff0c;通过计算机对图像进行去除噪声增强、复原、分割、提取特征等处理的方法和技术。多用于目标检测与目标识别等领域。>>数字图像处理、CV、CG与AI四者的关系图<<随着计算机视觉的迅速发展&#xff0c;基于深度学习的研究…

算法设计与分析——贪心算法——单个出水口打水问题

1.打水问题&#xff1a;有n个人去水房排队打水&#xff0c;只有一个出水口&#xff0c;且出水口流速恒定。每个人因为盛水的工具不一&#xff0c;打水所需的时间也不一致&#xff0c;设第i个人所需要的打水时间为ti&#xff1b;问如何安排打水顺序使得所有人的平均等待时间最短…

在传统行业做数字化转型之最终篇

【数字化转型】| 作者 / Edison Zhou这是EdisonTalk的第310篇原创内容在过去的两年时间里&#xff0c;我加入了一家传统行业的企业参与其数字化转型的过程&#xff0c;现在我将我的经历分享出来&#xff0c;本文是最终篇&#xff0c;主要会回答中途一些网友的问题以及推荐一些参…

算法设计与分析——贪心算法——汽车加油问题

汽车加油问题&#xff1a;一辆汽车加满油后可行驶n公里&#xff0c;旅途中有若干个加油站&#xff0c;两加油站间距离不超n 公里&#xff0c;起点离第一个加油站距离及最后一个加油站离终点距离也不超过n公里。算法给出应在哪些加油站停靠加油&#xff0c;使沿途加油次数最少。…

.NET Conf China 2020志愿者招募火热开启!还有神秘惊喜等你来领…

距.NET Conf China 2020 2020 中国 .NET 开发者大会开幕还有14天作为.NET的组织者之一我们已经为这个活动准备铺垫了很久但为了保证活动方方面面的质量为了给现场&线下的小伙伴们带来更好的体验现在&#xff01;我们十分需要你们的帮助&#xff01;为更好地做好大会服务工作…

golang 修改nginx配置文件_「系统架构」Nginx调优,不可错过的几点

通常&#xff0c;Nginx在安装完后&#xff0c;不用更改任何配置信息&#xff0c;我们就可以直接运行它。但是&#xff0c;这显然不能满足我们的生产要求。在生产中&#xff0c;要让Nginx能正常高效地运行我们的应用&#xff0c;我们通常需要对Nginx的配置文件进行一些参数上的设…

如何在 C# 中使用 Attribute

译文链接&#xff1a;https://www.infoworld.com/article/3006630/how-to-work-with-attributes-in-c.html?nsdrtrueAttribute 在 C# 中是一个非常强大的特性&#xff0c;它能够给你的程序集添加元数据信息。Attribute 实际上是一个对象&#xff0c;它可以与以下元素中的任何一…

readyread信号不触发_触发器型PFD与传统型PFD性能仿真对比

&#xfeff;TOC 鉴频鉴相器中为了保证鉴相范围&#xff0c;主要有两种PFD可以在理想情况下实现 到 的鉴相范围。 传统的PFD和边沿触发型的PFD1.电路结构1.1传统型电路结构参考文献&#xff1a;宽带CMOS分数频率合成器的研究与实现——黄福青 东南大学博士论文 1.2 触发器型电路…

算法设计与分析——分治与递归——整数划分问题

将正整数n表示为一系列正整数之和&#xff0c; nn1n2n3n4......nk &#xff08;其中&#xff0c;n1>n2>n3>n4........>nk>0,k>1&#xff09;正整数n的这种表示成为正整数n的划分。正整数n的不同划分个数成为正整数n的划分数&#xff0c;记作p&#xff08;n…

跟我一起学Redis之Redis持久化必知必会

前言Redis是出了名的速度快&#xff0c;那是因为在内存中进行数据存储和操作&#xff1b;如果仅仅是在内存中进行数据存储&#xff0c;那就会导致以下问题&#xff1a;•数据随进程退出而消失&#xff1a;当服务器断电或Redis Server进程退出时&#xff0c;内存肯定随之释放&am…

算法设计与分析——分支限界法——装载问题

有一批共个集装箱要装上2艘载重量分别为C1和C2的轮船&#xff0c;其中集装箱i的重量为Wi&#xff0c;且装载问题要求确定是否有一个合理的装载方案可将这个集装箱装上这2艘轮船。如果有&#xff0c;找出一种装载方案。 容易证明&#xff1a;如果一个给定装载问题有解&#xff…

BootstrapBlazor 之王者组件 Table

强大的表格组件Gitee 开源地址为&#xff1a;https://gitee.com/LongbowEnterprise/BootstrapBlazorGithub 开源地址为&#xff1a;https://github.com/ArgoZhang/BootstrapBlazor在线演示网站&#xff1a;https://www.blazor.zone1、前言 Table&#xff08;表格&#xff09;组…