Web API 速率限制(四)- 其它和AspNetCoreRateLimit

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Web API 速率限制(四)- 其它和AspNetCoreRateLimit相关的知识,希望对你有一定的参考价值。

参考技术A

返回的状态码

其它开发者调用限速系统的API时,如果超过了配额,也就是请求被拒绝,那么这时应该返回429状态码,表示用户在某段时间内发送的请求过多 。通常标准的做法还会设置 retry-after 这个header,来告诉API调用者多久以后可以重试请求。

例子

HTTP/2 429

Date: Sun, 17 Jun 2018 14:43:38 GMT

retry-after: 36

自定义响应Header

除了返回状态码,还应该返回一些自定义的header来解释速率限制的情况,这会对调用API的开发者有用。这些常用的Headers包括:

例子

HTTP/1.1 200 OK

Date: Sat, 11 Nov 2017 04:37:22 GMT

Status: 200 OK

X-RateLimit-Limit: 60

X-RateLimit-Remaining: 59

X-RateLimit-Reset: 1510378642

AspNetCoreRateLimit

AspNetCoreRateLimit,它是ASP.NET Core速率限制中间件,地址是:

https://github.com/stefanprodan/AspNetCoreRateLimit

使用简介

首先在Startup的ConfigureServices里面注册,用到了MemoryCache:

这里配置的是IP限制,它允许有很多规则,这里我只用了一个:针对所有的资源,每5分钟最多3次请求。

现在,我需要注册一个策略存储和速率限制计数器的存储,这两个是被中间件使用。所以还需要注册这两个服务:

这里都使用的是Singleton单例,因为我们需要的是针对全局的请求来做操作。

接下来要在管道里添加中间件,它应该放在靠前的位置,在日志和异常之后:

测试,发送一个请求看结果:

可以看到5分钟内还剩下两次请求的配额。限制重置的时间大约在5分钟之后。

发送请求超限之后,就会返回429:

Retry-After提示了再过294秒后可以再试试。

而响应的body是这样提示的:

我们再组合几个其它的规则:

现在允许5分钟10次请求,但是每10秒钟最多只能有两次请求。

第一次请求后:

5分钟内还剩9次,然后我10秒内连续发送两次请求,然后再发送一次请求:

这时超出了限制,Header里:

提示6秒后可以重试, 6秒后再次发送请求:

以上是关于Web API 速率限制(四)- 其它和AspNetCoreRateLimit的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Twitter API 用于超过 REST 速率限制的大型 Web 应用程序

Laravel - 限制特定 API 路由的速率

谷歌驱动 API 超出用户速率限制

Yii2框架RESTful API教程 - 格式化响应,授权认证和速率限制

关于 Spotify Api 上的速率限制请求/分钟的任何想法?

速率限制系列part2—作用于API网关的速率限制