---
title: "スロットルリクエスト"
slug: "throttle-requests"
abstract: "ODataサービスを通じてのリクエスト頻度を制限してください"
---
# スロットルリクエスト

Sitecoreへのリクエスト数を制限することができます。Services.Client。以下のように考えてみてください。

-   リクエスト頻度を制限するために。
-   ユーザータイプ(例えば無料か有料か)に応じて異なるサービス対応戦略を用いること。
-   高頻度リクエスト攻撃を防ぐためです。

このトピックでは以下の内容を説明します:

-   [スロットル戦略](https://doc.sitecore.com/xp/ja/developers/93/sitecore-experience-manager/throttle-requests.html#UUID-39ce3103-89a8-f32a-e256-1d4c4a1faeeb_N1530102447463 "Throttle strategies")
-   [戦略の設定](https://doc.sitecore.com/xp/ja/developers/93/sitecore-experience-manager/throttle-requests.html#UUID-39ce3103-89a8-f32a-e256-1d4c4a1faeeb_N1530102521575 "Configuring a strategy")
-   [戦略の適用](https://doc.sitecore.com/xp/ja/developers/93/sitecore-experience-manager/throttle-requests.html#UUID-39ce3103-89a8-f32a-e256-1d4c4a1faeeb_N1530102540106 "Applying a strategy")

## スロットル戦略

Sitecore。Services.Clientは、1時間間隔あたりのリクエスト数を制限するためのAPIを提供しています。デフォルトでは、Sitecore。Services.Clientには2つのスロットル戦略があります:

-   スライディングウィンドウ – 時間間隔とその間隔内で許可されたリクエスト数を指定します。Sitecoreはさらなるリクエストを制限します。
-   複合戦略 – 複数の戦略を一つにまとめます。

> !注戦略自体を含めることはできません。なぜなら、それは循環的な参照を生むからです。

例えば、異なるパラメータを持つ複数のスライディングウィンドウ戦略を作成できます。最初のものは短い時間(1〜5秒)でリクエストを拒否し、2つ目ははるかに長い時間(24時間)後にリクエストを拒否します。

> !注スケールされた環境では、Sitecoreはインスタンス間で戦略状態を共有しません。戦略は各インスタンスに独自の状態を持ちます。

スロットリングはデフォルトで無効化されています。スロットリングを有効にするには、以下の方法でApp\_Config\\Sitecore\\Services.Client Sitecore.Services.Client.configファイルをパッチで行います。

-   <setting name="Sitecore.Services.IsThrottleEnabled" value="false" />の値をtrueに変更します。

戦略はmasterデータベースの*/sitecore/system/Settings/Services/Throttle Strategies*の項目にあります。

*Throttle Strategies*の下に直接戦略を追加することもできますし、サブフォルダ(*Strategy Folder*)を作成してそのサブフォルダに戦略を追加することもできます。

## 戦略の設定

各戦略項目の**Common Options**セクションの**Type**フィールドの値を指定する必要があります。その値は戦略を実装するクラスのフルネームであり、例えばSitecore.Services.Infrastructure.Throttle.Strategies.SlidingWindowThrottleStrategy, Sitecore.Services.Infrastructure。

戦略項目は戦略の種類に依存する特定のパラメータセットを含みます。パラメータは戦略の振る舞いを指定します。

例えば、スライディングウィンドウ戦略の場合:

![Set time span for a sliding window](https://doc.sitecore.com/api/markdown-image/xp/ja/developers/93/sitecore-experience-manager/images/Throttle_requests-Picture_2-rId10-1106920143.png)

例えば、複合戦略の場合:

![Specify a composite strategy](https://doc.sitecore.com/api/markdown-image/xp/ja/developers/93/sitecore-experience-manager/images/Throttle_requests-Picture_10-rId11-252023046.png)

## 戦略の適用

戦略は3つの方法で適用できます:

-   APIキーを使いましょう。
-   APIコントローラー(属性ベースのスロットル)のメソッドを使いましょう。
-   APIコントローラーを使いましょう。

これらの手法はどんな組み合わせでも使えます。Sitecoreはこれらの戦略の結果を組み合わせています。

Sitecoreは、リクエストに対して2つ以上の戦略を適用する場合、以下のルールを使用します。

-   同じ戦略を複数回指定した場合、Sitecoreは一度だけ適用します。
-   メソッドやコントローラーに対して複数の戦略を指定した場合、Sitecoreはそれらの戦略を組み合わせます。

同じ戦略を複数回使うと、戦略は状態を共有します。例えば、Time Span = 1000 msとAllowed Number of Requests = 5 requestsパラメータでスライディングウィンドウ戦略を指定し、それを2つのサービスに適用すると、1000msのウィンドウ内で合計5回のリクエストしか可能になりません。

Sitecoreが戦略を適用した際にエラーが発生した場合、リクエストは内部サーバーエラー(コード500)を受け取ります。

### APIキーの使用

APIキーを使って戦略を適用すると、Sitecoreはその戦略をすべてのSitecoreに適用します。このAPIキーを使うサービス。クライアントのリクエスト。APIキーとOData APIキーの両方を使って戦略を適用できます。

例えば:

ServicesController
RequiredApiKey
public class SampleController : ApiController
 Route("api/throttle/datawithkey")
 public IEnumerable<string> GetData()
 {
 return new
 {
 "The Key : " + Guid.NewGuid()
 };
 }
}

例では、RequiredApiKey属性が定義されており、このコントローラーにアクセスするにはAPIキーが必須です。SitecoreはAPIキーが有効かつ使用可能かどうかを確認します。キーが有効であれば、Sitecoreは任意の戦略をリクエストに適用します。

APIキー項目の**「データ**」セクションにある**スロットル戦略**フィールドで戦略を定義します。

### APIコントローラーメソッドの使用

APIコントローラーメソッドに戦略を適用するには、コントローラーを定義し、その戦略を直接アクションに適用してください。例えば:

ServicesController
public class SampleController : ApiController
{
 Throttle("Sliding Window")
 Route("api/throttle/data")
 public IEnumerable<string> GetData()
 {
 return new
 {
 "The Key : " + Guid.NewGuid()
 };
 }
 Throttle("Composite")
 Route("api/throttle/compositedata")
 public IEnumerable<string> GetCompositeData()
 {
 return new
 {
 "The Key : " + Guid.NewGuid()
 };
 }
}

### コントローラーの使用

コントローラーに戦略を適用するには、コントローラーを定義し、その後コントローラーのクラスに戦略を適用します。例えば:

RequiredApiKey
Throttle("07 On Controller")
public class ThrottledOnControllerController : ApiController
{
 Route("api/ThrottledOnController/data")
 public IEnumerable<string> GetData()
 {
 return new { "Controller api/ThrottledOnController/data was called: " + DateTime.Now };
 }
}

Sitecore *07 On Controller*戦略を*ThrottledOnControllerController*コントローラーのあらゆる方法に適用します。