著者: Dflying Chen ( http://dflying.cnblogs.com/ )
このシリーズの前の記事 (ASP.NET Atlas での Web サービスの呼び出し - 概要と簡単なアプリケーション) では、Atlas で Web サービスを呼び出す最も基本的な方法を理解しましたが、実際の開発では、リクエストを作成して待機するだけです。ほとんどの場合、結果を返すだけでは十分ではなく、エラー タイムアウトなどの処理を考慮し、ユーザーが操作をキャンセルできるようにする必要もあります。幸いなことに、Atlas の Web サービスにおける Web メソッドのカプセル化では、これらのニーズも完全に考慮されています。
たとえば、次の Web メソッドの例を示します。
public class ComplexWebService : System.Web.Services.WebService {
[WebMethod]
パブリック文字列 BadMethod(int lateTime, bool throwException)
{
// 何か何か
}
}
Atlas によって生成された JavaScript マッシュアップには、次のシグネチャがあります: ComplexWebService.BadMethod(
遅延時間、
スロー例外、
onMethodComplete、
onMethodTimeout、
onメソッドエラー、
onメソッド中止、
ユーザーコンテキスト、
タイムアウト間隔、
優先度、
useGetメソッド、
);
Web メソッドの 2 つのパラメーターは、JavaScript メソッドの最初の 2 つのパラメーターとして順番に使用され、いくつかの追加パラメーターがあることに注意してください。
onMethodComplete: メソッドが完了して正常に返されたときにトリガーされるコールバック関数の名前を指定します。一般に、常にこのメソッドを指定する必要があります。
onMethodTimeout,: メソッドの実行がタイムアウトしたときにトリガーされる関数名を指定します。
onMethodError: メソッドの実行中に例外が発生したときにトリガーされる関数名を指定します。
onMethodAborted: 実行中にユーザーによってメソッドがキャンセルされたときにトリガーされる関数の名前を指定します。
userContext: ユーザー コンテキスト オブジェクト。上記の 4 つの関数でアクセスできます。
timeoutInterval: タイムアウトの制限時間をミリ秒単位で設定します。デフォルト値は 90000 のようです。通常、変更は必要ありません。
priority: このメソッドの実行優先度を設定します。この優先順位は、バッチ AJAX 操作で使用されます (次の記事で説明します)。
useGetMethod: HTTP GET を使用してリクエストを送信するかどうか。デフォルトは false です。
上記の 8 つの属性の順序は指定どおりである必要があります。ただし、場合によっては、順序の後のパラメーターのみを指定する必要があり、前のパラメーターを同時に記述する必要があります。このため、Atlas は別の呼び出しメソッドを特別に提供し、上記の 8 つのパラメーターを辞書の形式でメソッドに渡します。たとえば、onMethodComplete パラメーターと timeoutInterval パラメーターのみが必要な場合は、次のように記述できます。
ComplexWebService.BadMethod(
遅延時間、
スロー例外、
{
onMethodComplete: completeHandler、
タイムアウト間隔: 10000
}
);
それでは、通常の状況における上記 4 つのコールバック関数 (onMethodComplete、onMethodTimeout、onMethodError、onMethodAborted) の共通処理を例を使って見てみましょう。
まず、冒頭の Web サービス メソッドを完成させましょう
。
System.Web を使用します。
System.Web.Services を使用します。
System.Web.Services.Protocols を使用する
[WebService(Namespace = " http://tempuri.org/ ")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
パブリック クラス ComplexWebService : System.Web.Services.WebService {
[WebMethod]
パブリック文字列 BadMethod(int lateTime, bool throwException)
{
if(例外をスロー)
{
throw new Exception("申し訳ありませんが、これはやりたくないです!");
}
System.Threading.Thread.Sleep(遅延時間);
「完了!」を返します。
}
。1
つはメソッドの遅延を指定する lateTime で、もう 1 つはメソッドが例外をスローするかどうかを指定する throwException です。呼び出し時にこれら 2 つのパラメーターと timeoutInterval パラメーターを制御することで、完了、タイムアウト、および例外の状況をシミュレートできます。
次に、ScriptManager をページに追加し、この Web サービスへの参照を追加します:
<atlas:ScriptManager ID="ScriptManager1" runat="server">
<サービス>
<atlas:ServiceReference Path="ComplexWebService.asmx" />
</サービス>
</atlas:スクリプトマネージャー>
ASPX ページに 4 つのボタンを追加して、次の 4 つの状況をトリガーします。 <div>
これは悪い方法であり、次のような可能性があります。<br />
<input id="btnWorkFine" type="button" value="正常に動作します" onclick="return btnWorkFine_onclick()" />
<input id="btnTimeOut" type="button" value="timeout" onclick="return btnTimeOut_onclick()" />
<input id="btnThrowException" type="button" value="例外をスローする" onclick="return btnThrowException_onclick()" />
<input id="btnCanceld" type="button" value="キャンセルを取得" onclick="return btnCanceld_onclick()" />
</div>
正常に完了し、サーバー側で遅延や例外を指定せず、妥当なタイムアウト (10 秒) を与えました。
function btnWorkFine_onclick() {
ComplexWebService.BadMethod(
0、
間違い、
onBadMethodComplete、
onBadMethodTimeout、
onBadMethodError、
onBadMethodAborted、
"btnWorkFine_onclick",
10000
);
}
関数 onBadMethodComplete(結果)
{
アラート(結果);
}
タイムアウト。サーバー側の遅延を 3 秒に指定しますが、タイムアウトは 1 秒のみに設定されます。
function btnTimeOut_onclick() {
ComplexWebService.BadMethod(
3000、
間違い、
onBadMethodComplete、
onBadMethodTimeout、
onBadMethodError、
onBadMethodAborted、
"btnTimeOut_onclick",
1000
);
}
関数 onBadMethodTimeout(リクエスト, userContext)
{
var timeoutString = "「" + userContext + "」の呼び出しはタイムアウトのため失敗しました!";
アラート(タイムアウト文字列);
}
例外、サーバーによってスローされた例外を指定します。コールバック関数で応答パラメータを使用すると、詳細なエラー情報を取得できることに注意してください。
function btnThrowException_onclick() {
ComplexWebService.BadMethod(
0、
真実、
onBadMethodComplete、
onBadMethodTimeout、
onBadMethodError、
onBadMethodAborted、
"btnThrowException_onclick",
10000
);
}
function onBadMethodError(結果、応答、userContext)
{
var errorString = "テスト '" + userContext + "' 失敗しました!";
if (結果 == null) {
errorString += "ステータスコード='" + response.get_statusCode() + "'";
}
それ以外 {
エラー文字列 +=
" Message='" + result.get_message() +
"'rnstackTrace = " + result.get_stackTrace();
}
アラート(エラー文字列);
}
ユーザーによるキャンセル。通常の完了と似ていますが、リクエストを行った直後に request.abort() を使用して操作をキャンセルします。
function btnCanceld_onclick() {
var request = ComplexWebService.BadMethod(
2000年、
間違い、
onBadMethodComplete、
onBadMethodTimeout、
onBadMethodError、
onBadMethodAborted、
"btnCanceld_onclick",
10000
);
request.abort();
}
function onBadMethodAborted(request, userContext) {
var errorString = "「" + userContext + "」の呼び出しが失敗しました。リクエストは中止されました!";
アラート(エラー文字列);
サンプル プログラムはここからダウンロードできます
。