Penulis: Dflying Chen ( http://dflying.cnblogs.com/ )
Dalam artikel sebelumnya dari seri ini (Memanggil Layanan Web di ASP.NET Atlas - Pengenalan dan Aplikasi Sederhana), kita sudah familiar dengan metode paling dasar memanggil Layanan Web di Atlas, namun dalam pengembangan sebenarnya, kita hanya membuat permintaan dan menunggu . Mengembalikan hasil saja tidak cukup. Sebagian besar dari kita perlu mempertimbangkan penanganan batas waktu kesalahan, dll., dan juga mengizinkan pengguna untuk membatalkan operasi. Untungnya, enkapsulasi Metode Web di Layanan Web Atlas juga sepenuhnya mempertimbangkan kebutuhan ini.
Mari kita berikan contoh Metode Web untuk mengilustrasikannya. Misalnya, untuk Metode Web berikut:
public class ComplexWebService : System.Web.Services.WebService {
[WebMethod]
string publik Metode Buruk(int waktu tunda, bool throwException)
{
// sesuatu sesuatu
}
}
Perpaduan JavaScript yang dihasilkan oleh Atlas akan memiliki tanda tangan berikut: ComplexWebService.BadMethod(
waktu tunda,
melempar pengecualian,
padaMetodeLengkap,
padaMethodTimeout,
padaMethodError,
padaMetodeDibatalkan,
Konteks pengguna,
Interval batas waktu,
prioritas,
gunakanGetMethod,
);
Perhatikan bahwa dua parameter dalam Metode Web digunakan sebagai dua parameter pertama metode JavaScript secara berurutan, dan ada beberapa parameter tambahan:
onMethodComplete: Menentukan nama fungsi panggilan balik yang dipicu ketika metode selesai dan berhasil dikembalikan. Secara umum Anda harus selalu menentukan metode ini.
onMethodTimeout,: Menentukan nama fungsi yang dipicu ketika waktu eksekusi metode habis.
onMethodError: Menentukan nama fungsi yang dipicu ketika metode menemukan pengecualian selama eksekusi.
onMethodAborted: Tentukan nama fungsi yang dipicu ketika metode dibatalkan oleh pengguna selama eksekusi.
userContext: Objek konteks pengguna, yang dapat diakses dalam empat fungsi di atas.
timeoutInterval: Tetapkan batas waktu untuk batas waktu dalam milidetik. Nilai defaultnya adalah 90000. Biasanya tidak diperlukan perubahan.
prioritas: Tetapkan prioritas eksekusi metode ini. Prioritas ini akan digunakan dalam operasi batch AJAX (disebutkan di artikel berikutnya).
useGetMethod: Apakah akan menggunakan HTTP GET untuk mengirim permintaan, defaultnya salah.
Urutan delapan atribut di atas harus sesuai yang ditentukan. Namun terkadang kita hanya perlu menentukan parameter nanti dalam urutannya, dan kita harus menulis parameter sebelumnya pada saat yang bersamaan. Untuk alasan ini, Atlas secara khusus memberi kita metode pemanggilan lain, meneruskan delapan parameter di atas ke metode dalam bentuk kamus. Misalnya, ketika kita hanya membutuhkan parameter onMethodComplete dan timeoutInterval, kita dapat menulis seperti ini:
ComplexWebService.BadMethod(
waktu tunda,
melempar pengecualian,
{
onMethodComplete: completeHandler,
Interval batas waktu: 10.000
}
);
Oke, mari kita lihat pemrosesan umum pada empat fungsi panggilan balik di atas (onMethodComplete, onMethodTimeout, onMethodError, dan onMethodAborted) dalam keadaan normal melalui sebuah contoh.
Pertama mari kita selesaikan metode Layanan Web di awal:
menggunakan Sistem;
menggunakan Sistem.Web;
menggunakan System.Web.Layanan;
menggunakan System.Web.Services.Protocols;
[WebService(Namespace = " http://tempuri.org/ ")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
kelas publik ComplexWebService : System.Web.Services.WebService {
[Metode Web]
string publik Metode Buruk(int waktu tunda, bool throwException)
{
jika(melemparException)
{
throw new Exception("Maaf, saya tidak suka melakukan ini!");
}
Sistem.Threading.Thread.Tidur(waktu tunda);
kembalikan "Selesai!";
}
}
Anda dapat melihat bahwa metode ini memiliki dua parameter: delayTime menentukan penundaan metode, dan throwException menentukan apakah metode memunculkan pengecualian. Dengan mengontrol kedua parameter ini dan parameter timeoutInterval saat memanggil, kita dapat mensimulasikan situasi penyelesaian, batas waktu, dan pengecualian.
Kemudian, tambahkan ScriptManager ke halaman tersebut dan tambahkan referensi ke Layanan Web ini:
<atlas:ScriptManager ID="ScriptManager1" runat="server">
<Layanan>
<atlas:ServiceReference Path="ComplexWebService.asmx" />
</Layanan>
</atlas:Manajer Skrip>
Tambahkan empat tombol ke halaman ASPX untuk memicu empat situasi berikut: <div>
Ini adalah metode yang BURUK, dapat:<br />
<input id="btnWorkFine" type="button" value="berfungsi dengan baik" onclick="kembalikan btnWorkFine_onclick()" />
<input id="btnTimeOut" type="button" value="timeout" onclick="kembalikan btnTimeOut_onclick()" />
<input id="btnThrowException" type="button" value="lemparkan pengecualian" onclick="kembalikan btnThrowException_onclick()" />
<input id="btnCanceld" type="button" value="dibatalkan" onclick="kembalikan btnCanceld_onclick()" />
</div>
Selesai secara normal, kami tidak menetapkan penundaan atau pengecualian di sisi server, dan memberikan batas waktu yang wajar (10 detik):
function btnWorkFine_onclick() {
Layanan Web Kompleks.Metode Buruk(
0,
PALSU,
onBadMethodComplete,
padaBadMethodTimeout,
padaBadMethodError,
pada Metode Buruk Dibatalkan,
"btnWorkFine_onclick",
10.000
);
}
fungsi onBadMethodComplete(hasil)
{
peringatan(hasil);
}
Batas waktu, tentukan penundaan sisi server selama 3 detik, tetapi batas waktu disetel hanya 1 detik:
function btnTimeOut_onclick() {
Layanan Web Kompleks.Metode Buruk(
3000,
PALSU,
onBadMethodComplete,
padaBadMethodTimeout,
padaBadMethodError,
pada Metode Buruk Dibatalkan,
"btnTimeOut_onclick",
1000
);
}
fungsi onBadMethodTimeout(permintaan, userContext)
{
var timeoutString = "Panggilan ke '" + userContext + "' gagal karena waktu habis!";
peringatan(batas waktuString);
}
Pengecualian, tentukan pengecualian yang diberikan oleh server. Perhatikan bahwa Anda dapat menggunakan parameter respons dalam fungsi panggilan balik untuk mendapatkan informasi kesalahan terperinci:
function btnThrowException_onclick() {
Layanan Web Kompleks.Metode Buruk(
0,
BENAR,
onBadMethodComplete,
padaBadMethodTimeout,
padaBadMethodError,
pada Metode Buruk Dibatalkan,
"btnThrowException_onclick",
10.000
);
}
fungsi onBadMethodError(hasil, respons, konteks pengguna)
{
var errorString = "Uji '" + userContext + "' gagal!";
jika (hasil == nol) {
errorString += "Kode status='" + respon.get_statusCode() + "'";
}
kalau tidak {
string kesalahan +=
" Pesan='" + hasil.get_message() +
"'rnstackTrace = " + hasil.get_stackTrace();
}
peringatan(errorString);
}
Pembatalan pengguna, mirip dengan penyelesaian normal, tetapi menggunakan request.abort() untuk membatalkan operasi segera setelah membuat permintaan:
function btnCanceld_onclick() {
var permintaan = ComplexWebService.BadMethod(
2000,
PALSU,
onBadMethodComplete,
padaBadMethodTimeout,
padaBadMethodError,
pada Metode Buruk Dibatalkan,
"btnBatal_onklik",
10.000
);
permintaan.batalkan();
}
fungsi onBadMethodAborted(permintaan, userContext) {
var errorString = "Panggilan ke '" + userContext + "' gagal, permintaan dibatalkan!";
peringatan(errorString);
}
Contoh program dapat diunduh disini: