フレームワークを制限WebApiThrottle

、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()
});

 

おすすめ

転載: www.cnblogs.com/fger/p/11119566.html