Penulis: Dflying Chen ( http://dflying.cnblog.som/ )
Untuk program Atlas, dalam beberapa kasus, kita perlu memanggil sejumlah besar Layanan Web dalam waktu singkat, seperti pengguna dalam daftar dengan cepat mengklik untuk menghapus . Pada saat ini, bandwidth jaringan, stabilitas, dll. sering kali menyebabkan penundaan yang lebih lama. Jika panggilan ini dapat dikemas menjadi satu permintaan, pengguna hanya perlu mengalami satu penundaan jaringan untuk mendapatkan hasil pemrosesan, yang secara tidak langsung juga meningkatkan efisiensi. Tampaknya ini bukan fungsi yang mudah untuk diterapkan, namun untungnya, Atlas memiliki dukungan bawaan untuk layanan web panggilan batch. Yang Anda perlukan hanyalah pengaturan sederhana dalam program.
Setiap permintaan panggilan Layanan Web di Atlas memiliki tiga prioritas: 0: tinggi, 1: sedang, 2: rendah, dan nilai defaultnya adalah sedang.
Saat menelepon, Anda dapat menentukan prioritas panggilan ini melalui parameter prioritas (silakan merujuk ke: Memanggil Layanan Web di ASP.NET Atlas - Menangani Kesalahan, Batas Waktu, dan Menanggapi Operasi Pembatalan Pengguna). Untuk panggilan berprioritas tinggi, Atlas tidak menerapkan panggilan batch dan akan mengirimkan permintaan segera setiap saat; untuk panggilan berprioritas menengah dan rendah, Atlas akan menyelesaikan panggilan dalam jangka waktu tertentu (silakan lihat pengenalan WebRequestManager di bawah ) menjadi satu Permintaan individu dikirim bersama-sama, atau ketika jumlah permintaan yang akan dipanggil mencapai jumlah yang ditentukan (silakan lihat pengenalan WebRequestManager di bawah). Jika permintaan yang harus dipanggil terlalu banyak, maka permintaan dengan prioritas sedang akan dipilih untuk dipanggil terlebih dahulu.
Untuk mengaktifkan dukungan Layanan Web panggilan batch bawaan Atlas, Anda harus terlebih dahulu mendaftarkan pengendali sisi server untuk pemrosesan panggilan batch di web.config (Template Situs Web Atlas default telah mengaktifkan pengendali ini):
<httpHandlers>
<tambahkan kata kerja = "*" path = "atlasbatchcall.axd" type = "Microsoft.Web.Services.MultiRequestHandler" validasi = "false"/>
</httpHandler>
Kemudian tambahkan pernyataan tampilan WebRequestManager ke skrip Atlas XML halaman tersebut dan atur halaman agar mengizinkan panggilan batch ke Layanan Web: <script type="text/xml-script">
<halaman xmlns:script=" http://schemas.microsoft.com/xml-script/2005 ">
<komponen>
<webRequestManager batchSize="5" aktifkanBatching="benar" batchDelay="3000" />
</komponen>
</halaman>
</skrip>
Yang perlu Anda perhatikan di sini adalah tiga properti WebRequestManager berikut:
aktifkanBatching: Setel apakah halaman mengizinkan panggilan batch Nilai defaultnya salah. Di sini kita harus mengaturnya menjadi true.
batchSize: Tetapkan jumlah maksimum permintaan yang disertakan dalam panggilan batch. Nilai defaultnya adalah 5. Ketika jumlah permintaan yang dipanggil melebihi pengaturan ini, permintaan batch akan segera dikeluarkan meskipun batas waktu yang ditetapkan dalam batchDelay tidak tercapai.
batchDelay: Tetapkan batas waktu tunggu untuk panggilan batch. Nilai defaultnya adalah 1000 (milidetik). Ketika batas waktu tunggu melebihi pengaturan ini, permintaan batch akan segera dikeluarkan meskipun jumlah permintaan di batchSize tidak tercapai.
Setelah pengaturan ini, panggilan batch akan diterapkan ke setiap permintaan Layanan Web di halaman. Oleh karena itu, untuk satu panggilan, Anda harus menentukan prioritasnya sebagai tinggi.
Mari kita lihat contohnya. Pertama, tulis Layanan Web yang memiliki Metode Web berikut. Kedua parameter tersebut mewakili urutan tugas (sehingga kita dapat membedakan urutan pelaksanaan tugas) dan prioritasnya:
[Metode Web]
string publik DoTask (int taskID, prioritas int)
{
if (prioritas < 0 || prioritas > 2)
throw new Exception("prioritas hanya boleh 0, 1 atau 2!");
return string.Format("Tugas (ID: {0}, Prioritas: {1}) selesai.", taskID, prioritas);
}
Kemudian ikuti kode di awal untuk mengaktifkan panggilan batch di web.config, dan tambahkan WebRequestManager ke halaman. Jangan lupa bahwa ScriptManager juga diperlukan pada halaman untuk mereferensikan Layanan Web yang ditentukan di atas: <atlas:ScriptManager ID= "scriptManager" runat="server">
<Layanan>
<atlas:ServiceReference Path="SampleService.asmx" />
</Layanan>
</atlas:Manajer Skrip>
Tambahkan markup HTML. Tombol ini digunakan untuk memicu panggilan batch, dan div digunakan untuk menampilkan hasil panggilan:
<input id="invokeTasks" type="button" value="Invoke Task Calls" onclick="return invokeTasks_onclick()" />
<div id="hasil"/>
Terakhir, ada skrip JavaScript untuk memanggil Layanan Web:
function invokeTasks_onclick()
{
// hapus hasilnya
$('hasil').innerHTML = '';
Lakukan Tugas(1, 2);
Lakukan Tugas(1, 1);
Lakukan Tugas(2, 0);
}
var ID tugas = 0;
fungsi DoTask (waktu, prioritas)
{
untuk (var i = 0; i < kali; ++i)
{
SampleService.DoTask(
ID tugas++,
prioritas,
{onMethodComplete: OnComplete, prioritas: prioritas }
);
}
}
functionOnComplete(hasil)
{
$('hasil').innerHTML += hasil + "<br />";
}
Perhatikan bahwa metode DoTask() menerima dua parameter: waktu digunakan untuk menentukan jumlah panggilan, prioritas digunakan untuk menentukan prioritas, dan kami menggunakan variabel global taskID untuk mempertahankan urutan permintaan yang bertambah.
Dalam contoh ini, pertama-tama kita memanggil permintaan berprioritas rendah, lalu permintaan berprioritas sedang, dan terakhir dua permintaan berprioritas tinggi.
Karena prioritas tinggi tidak berpartisipasi dalam panggilan batch, hal pertama yang Anda lihat adalah kembalinya panggilan tersebut:
Karena jumlah total prioritas menengah dan rendah adalah 2 dan belum mencapai 5 , maka dikirim setelah penundaan 3000 milidetik:
Anda dapat mengubah urutan panggilan dan jumlah panggilan dalam metode invokeTasks_onclick() untuk menganalisis bagaimana panggilan batch diimplementasikan.
Contoh programnya dapat diunduh di sini: