、WebApiThrottle制限枠
1、Nugetのインストール(PM)
PM>インストール・パッケージWebApiThrottle
WebApiThrottle様々な制限ポリシーのカスタム設定のためのサポート。あなたは、毎時、毎日、1秒あたり許可されたIPとして、毎分の通話の毎週の最大数を異なる制約に基づいて、さまざまなシナリオの数を設定することができます。これらの制限は、要求を設定するには、各APIのインタフェースに対して個別に与えられるすべてのポリシーに配置することができます。
2、WebApiConfig増加
// WebApiConfigが増加 config.MessageHandlers.Add(新しい新しいThrottlingHandler() { ポリシー = 新しい新しいThrottlePolicyを( perSecond:1つの // 2番目のオプションのパラメータ限界あたりの回数 、perminute:20である // 分当たりのオプションのパラメータ制限 、perHour:200であります / / オプションのパラメータは、時間当たりの回数を制限 perday、:1500 // オプションのパラメータは、回数制限日 、perWeekを:3000 // オプションのパラメータは、週あたりの回数を制限します ) { IpThrottling= trueに、 // IP制限を有効にするかどうかを示す値 ClientThrottling = trueに // この値は、クライアント調整を有効にするかどうかを示す }、 リポジトリ = 新しい新しいCacheRepository() // QuotaExceededMessage = JsonConvert.SerializeObject(json.msg)、 QuotaExceededContent =( L、OBJ)=> // 違反制限イベント { // VARのJSON = {化するJsonResult新しい新しいコード= 0、= $ MSG "は、所定の周波数を超える、OBJ {L} {}"}; VARの JSON = 新しい新しい {コード= 0、= $ MSG " 所定の周波数を超える、L {} {} OBJ " }; // 匿名のJSON リターン(JSON); } })。
デフォルトでは、拒否された要求は、カウンタWebApiThrottleに蓄積されていません。たとえば、同じ第2の3回では、クライアント要求、そしてあなたは、ポリシー制限は毎秒1で設定する最初の要求が拒否されないため、その後、分、時間、日カウンタのみ、最初の呼び出しを記録します。あなたが拒否された要求は(分、時間、日)、別のカウンターで計算したい場合は、trueにStackBlockedRequestsを設定することができます。
config.MessageHandlers.Add(new ThrottlingHandler() { Policy = new ThrottlePolicy(perSecond: 1, perMinute: 30) { IpThrottling = true, ClientThrottling = true, EndpointThrottling = true, StackBlockedRequests = true //拒绝的请求累加到WebApiThrottle的计数器里 }, Repository = new CacheRepository() });
有的时候我们只需要设置一个参数,每分钟限流次数
//WebApiConfig 增加 config.MessageHandlers.Add(new ThrottlingHandler() { Policy = new ThrottlePolicy( perMinute: 5 )//可选参数 我们仅需要每分钟限制次数 { IpThrottling = true //该值指示是否启用IP限制 ,ClientThrottling = true //该值指示是否启用客户端限制 }, Repository = new CacheRepository(), //QuotaExceededMessage = JsonConvert.SerializeObject(json.msg), QuotaExceededContent = (l, obj) => //违反限流事件 { //var json = new JsonResult { code = 0, msg = $"超出规定的频率了,{l}{obj}" }; var json = new { code = 0, msg = $"超出规定的频率了,{l}{obj}" };//匿名Json return (json); } });
3、使用方式一(EnableThrottlingAttribute特性配置限制频率)
EnableThrottling与ThrottlingHandler是一个二选一的策略配置方案,二者会做同样的事情,但ThrottlingHandler可以通过EnableThrottlingAttribute特性指定某个webapi的controllers和actions去自定义频率限制。需要注意的是,在webapi请求管道中,ThrottlingHandler是在controller前面执行,因此在你不需要ThrottlingFilter提供的功能时,可以用ThrottlingHandler去直接替代它。
设置ThrottlingFilter过滤器的步骤,跟ThrottlingHandler类似:
config.Filters.Add(new ThrottlingFilter() { Policy = new ThrottlePolicy(perSecond: 1, perMinute: 20, perHour: 200, perDay: 2000, perWeek: 10000) { //ip配置区域 IpThrottling = true, IpRules = new Dictionary<string, RateLimits> { { "::1/10", new RateLimits { PerSecond = 2 } }, { "192.168.2.1", new RateLimits { PerMinute = 30, PerHour = 30*60, PerDay = 30*60*24 } } }, //添加127.0.0.1到白名单,本地地址不启用限流策略 IpWhitelist = new List<string> { "127.0.0.1", "192.168.0.0/24" }, //客户端配置区域,如果ip限制也是启动的,那么客户端限制策略会与ip限制策略组合使用。 ClientRules = new Dictionary<string, RateLimits> { { "api-client-key-demo", new RateLimits { PerDay = 5000 } } }, //白名单中的客户端key不会进行限流。 ClientWhitelist = new List<string> { "admin-key" }, //端点限制策略配置会从EnableThrottling特性中获取。 EndpointThrottling = true } });
使用特性开启限流并配置限制频率:
[EnableThrottling(PerSecond = 2)] public class ValuesController : ApiController { [EnableThrottling(PerSecond = 1, PerMinute = 30, PerHour = 100)] public IEnumerable<string> Get() { return new string[] { "value1", "value2" }; } [DisableThrotting] public string Get(int id) { return "value"; } }
4、使用方式二(端点自定义限制频率)
你也可以为明确的路由地址去自定义限制频率,这些限制配置会重写WebApiThrottle的默认配置。也可以通过相关联的路由地址去定义端点的限制规则,比如api/entry/1端点的请求仅仅是/entry/整个路由地址请求的一部分。 配置后,端点限制引擎会在请求的绝对URI中去搜索这个表达式(api/entry/1),如果这个表达式在请求路由策略中被找到,那么这个限制规则将会被应用。如果有两个或更多的限制规则匹配到同一个URL,更近一级的限制策略将会被应用。
config.MessageHandlers.Add(new ThrottlingHandler() { Policy = new ThrottlePolicy(perSecond: 1, perMinute: 20, perHour: 200) { IpThrottling = true, ClientThrottling = true, EndpointThrottling = true, EndpointRules = new Dictionary<string, RateLimits> { { "api/search", new RateLimits { PerSecond = 10, PerMinute = 100, PerHour = 1000 } } } }, Repository = new CacheRepository() });