著者: Dflying Chen ( http://dflying.cnblog.som/ )
Atlas プログラムでは、リスト内のユーザーが素早くクリックして削除するなど、場合によっては短時間に多数の Web サービスを呼び出す必要があります。 。現時点では、ネットワーク帯域幅や安定性などにより、遅延が長くなることがよくあります。これらの呼び出しを 1 つのリクエストにパッケージ化できれば、ユーザーは処理結果を得るまでに 1 回のネットワーク遅延に耐えるだけで済み、間接的に効率も向上します。これを実装するのは簡単な機能ではないようですが、幸いなことに、Atlas には Web サービスのバッチ呼び出しのサポートが組み込まれており、必要なのはプログラム内の簡単な設定だけです。
Atlas の各 Web サービス呼び出しリクエストには、0: 高、1: 中、2: 低の 3 つの優先度があり、デフォルト値は中です。
呼び出し時に、priority パラメーターを使用してこの呼び出しの優先度を指定できます (「ASP.NET Atlas での Web サービスの呼び出し - エラー、タイムアウトの処理、およびユーザーのキャンセル操作への応答」を参照してください)。高優先度の呼び出しの場合、Atlas はバッチ呼び出しを適用せず、毎回すぐにリクエストを送信します。中優先度および低優先度の呼び出しの場合、Atlas は一定期間内に呼び出しをラップします (以下の WebRequestManager の概要を参照してください)。 ) を 1 つにまとめます。個別のリクエストはまとめて送信されるか、呼び出されるリクエストの数が指定された数に達したときに送信されます (以下の WebRequestManager の概要を参照してください)。呼び出すリクエストが多すぎる場合は、優先度が中程度のリクエストが最初に呼び出されるように選択されます。
Atlas の組み込みバッチ呼び出し Web サービス サポートを有効にするには、まず web.config でバッチ呼び出し処理用のサーバー側ハンドラーを登録する必要があります (デフォルトの Atlas Web サイト テンプレートでこのハンドラーが有効になっています):
<httpHandlers>
<addverb="*" path="atlasbatchcall.axd" type="Microsoft.Web.Services.MultiRequestHandler" validate="false"/>
</httpハンドラー>
次に、WebRequestManager の表示ステートメントをページの Atlas XML スクリプトに追加し、Web サービスへのバッチ呼び出しを許可するようにページを設定します。<script type="text/xml-script">
<page xmlns:script=" http://schemas.microsoft.com/xml-script/2005 ">
<コンポーネント>
<webRequestManager patchSize="5" enableBatching="true" batchDelay="3000" />
</コンポーネント>
</ページ>
</script>
ここで注意する必要があるのは、WebRequestManager の次の 3 つのプロパティです。enableBatching
: ページでバッチ呼び出しを許可するかどうかを設定します。デフォルト値は false です。ここでは true に設定する必要があります。
バッチサイズ: バッチ呼び出しに含まれるリクエストの最大数を設定します。デフォルト値は 5 です。呼び出されるリクエスト数がこの設定を超えた場合、batchDelayで設定した制限時間に達していなくても、すぐにバッチリクエストが発行されます。
batchDelay: バッチ呼び出しの待機時間制限を設定します。デフォルト値は 1000 (ミリ秒) です。待ち時間制限がこの設定を超えると、batchSize のリクエスト数に達していなくても、すぐにバッチ リクエストが発行されます。
この設定の後、バッチ呼び出しはページ内のすべての Web サービス リクエストに適用されます。したがって、単一の呼び出しの場合は、その優先度を高に指定する必要があります。
例を見てみましょう。まず、次の Web メソッドを持つ Web サービスを作成します。この 2 つのパラメータはタスクの順序 (タスクの実行順序を区別できるようにするため) と優先順位を表します
。
パブリック文字列 DoTask(int タスク ID、int 優先度)
{
if (優先度 < 0 || 優先度 > 2)
throw new Exception("優先順位は 0、1、または 2 のみです!");
return string.Format("タスク (ID: {0}、優先度: {1}) が終了しました。", タスク ID, 優先度);
}
次に、冒頭のコードに従って web.config でバッチ呼び出しを有効にし、ページに WebRequestManager を追加して、上で定義した Web サービスを参照するための ScriptManager も必要であることを忘れないでください: <atlas:ScriptManager ID=。 "scriptManager" runat=" サーバー">
<サービス>
<atlas:ServiceReference Path="SampleService.asmx" />
</サービス>
</atlas:スクリプトマネージャー>
HTML マークアップを追加します。ボタンはバッチ呼び出しをトリガーするために使用され、div は呼び出し結果を表示するために使用されます。
<input id="invokeTasks" type="button" value="Invoke Task Calls" onclick="return invokeTasks_onclick()" />
<div id="結果"/>
最後に、Web サービスを呼び出す JavaScript スクリプト:
function invokeTasks_onclick()
があります。
{
// 出力をクリアします
$('結果').innerHTML = '';
DoTask(1, 2);
DoTask(1, 1);
DoTask(2, 0);
var
タスクID = 0;
関数 DoTask(回数、優先度)
{
for (var i = 0; i < 回; ++i)
{
SampleService.DoTask(
タスクID++、
優先度、
{onMethodComplete: OnComplete、優先度: 優先度 }
);
}
}
functionOnComplete(結果)
{
$('result').innerHTML += 結果 + "<br />";
}
DoTask() メソッドは 2 つのパラメーターを受け入れることに注意してください。times は呼び出し数の指定に使用され、priority は優先度の指定に使用され、グローバル変数 taskID は増分要求シーケンスを維持するために使用されます。
この例では、最初に低優先度のリクエストを呼び出し、次に中優先度のリクエストを呼び出し、最後に 2 つの高優先度のリクエストを呼び出しました。
高優先度はバッチ呼び出しに参加しないため、最初に表示されるのはその戻り値です。
中優先度および低優先度の合計数は2で、まだ5に達していないため、 3000ミリ秒の遅延後に送信されます。
invokeTasks_onclick()メソッドの呼び出しシーケンスと呼び出し数を変更して、バッチ呼び出しがどのように実装されるかを分析できます。
サンプル プログラムはここからダウンロードできます。