0

ASP.NET用の2つの優れたスロットル/レート制限ライブラリがあります。 MVCスロットルライブラリMvcThrottleとWeb APIスロットルライブラリWebApiThrottleがあります。WebApiThrottleミドルウェアMvcThrottle属性によるスロットリングの競合

私はセキュリティトークンのエンドポイントにレート制限を適用する必要があるまで、Web APIではなくOWINによって2つを調和させて使用していました。幸いなことに、WebApiThrottleにはミドルウェアスロットルが搭載されており、Web APIの外部にあるものはすべてスロットルされます。

残念ながら、私はミドルウェアスローラを適用した後、自分のウェブサイトのページにアクセスした後にInvalidCastExceptionエラーを取得し始めました。何が起こっているのですか、どうすれば修正できますか?

答えて

0

まあ、ミドルウェアのスロットルがWebページへのリクエストを処理していて、MVCスロットルがWebページへのリクエストを処理していたことがわかりました。各スロッターは同じキャッシュに読み書きしていましたが、キャッシュから値を読み取るときに、オブジェクトをWebApiThrottleオブジェクトにキャストしようとしましたが、もう1つはオブジェクトをMvcThrottleオブジェクトにキャストしようとしていました。それは良いことではありませんでした。

私はミドルウェアに慎重に構築された独自のポリシーを調整することで問題を解決しました。デフォルトでは、ポリシーは何も抑制しません。次に、特にセキュリティトークンのエンドポイントにスロットリングを適用するルールを追加します。

このようにして、セキュリティトークンのエンドポイントは依然として速度は制限されていますが、WebページのスロットルはMVCスロットルの属性によって完全に処理されます。ミドルウェアスローラは、ルールリストで上書きされないものは無視します。これは、既定のレート制限がすべて0であるため、スロットルが行われないことを意味します。例外はなくなり、すべてが順調です。

はここポリシークラスを絞るミドルウェアは次のようになります。実際のアプリケーションで

public class MiddlewareThrottlingPolicy : ThrottlePolicy 
{ 
    /// <summary> 
    /// Creates the middleware throttling policy 
    /// </summary> 
    public MiddlewareThrottlingPolicy() 
    { 
     //Everything is unthrottled by default. We don't have to do anything to achieve that 

     //We're throttling by endpoint 
     EndpointThrottling = true; 

     //Add the endpoints that get different throttling 
     RateLimits policySettings = new RateLimits 
     { 
      PerSecond = 30, 
      PerMinute = 100, 
      PerHour = 200, 
      PerDay = 500, 
      PerWeek = 0 
     }; 

     EndpointRules = new Dictionary<string, RateLimits> 
     { 
      { "/api/authentication/token", policySettings } 
     }; 
    } 
} 

、私は構成設定からレート制限をロードするが、私はここでそれを簡素化。

ここでは、アプリケーションを起動するとき、私はミドルウェアの調整ポリシーを適用する方法は次のとおりです。

app.Use(typeof(ThrottlingMiddleware), 
      new MiddlewareThrottlingPolicy(), 
      new PolicyCacheRepository(), 
      new CacheRepository(), 
      null, 
      null); 
関連する問題