まあ、ミドルウェアのスロットルが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);