ผู้แต่ง: Dflying Chen ( http://dflying.cnblog.som/ )
สำหรับโปรแกรม Atlas ในบางกรณีเราจำเป็นต้องเรียกใช้ Web Services จำนวนมากในเวลาอันสั้น เช่น ผู้ใช้ในรายการคลิกอย่างรวดเร็วเพื่อลบ . ในเวลานี้ แบนด์วิดท์เครือข่าย ความเสถียร ฯลฯ มักจะทำให้เกิดความล่าช้าอีกต่อไป หากการโทรเหล่านี้สามารถรวมเป็นคำขอเดียวได้ ผู้ใช้จะต้องอดทนต่อความล่าช้าของเครือข่ายเดียวเท่านั้นจึงจะได้รับผลการประมวลผล ซึ่งจะช่วยปรับปรุงประสิทธิภาพทางอ้อมด้วย ดูเหมือนว่านี่ไม่ใช่ฟังก์ชันที่ใช้งานง่าย แต่โชคดีที่ Atlas มีการสนับสนุนในตัวสำหรับการเรียกบริการทางเว็บแบบแบตช์ สิ่งที่คุณต้องมีคือการตั้งค่าง่ายๆ ในโปรแกรม
คำขอโทรบริการเว็บแต่ละรายการใน Atlas มีลำดับความสำคัญสามระดับ: 0: สูง, 1: ปานกลาง, 2: ต่ำ และค่าเริ่มต้นคือปานกลาง
เมื่อโทร คุณสามารถระบุลำดับความสำคัญของการโทรนี้ผ่านพารามิเตอร์ลำดับความสำคัญ (โปรดดูที่: การเรียกบริการเว็บใน ASP.NET Atlas - การจัดการข้อผิดพลาด การหมดเวลา และการตอบสนองต่อการดำเนินการยกเลิกของผู้ใช้) สำหรับการโทรที่มีลำดับความสำคัญสูง Atlas จะไม่ใช้การโทรแบบกลุ่มและจะส่งคำขอทันทีทุกครั้ง สำหรับการโทรที่มีลำดับความสำคัญปานกลางและต่ำ Atlas จะตัดการโทรภายในระยะเวลาหนึ่ง (โปรดดูคำแนะนำของ WebRequestManager ด้านล่าง ) เป็นคำขอส่วนบุคคลจะถูกส่งพร้อมกัน หรือเมื่อจำนวนคำขอที่จะเรียกถึงจำนวนที่ระบุ (โปรดดูคำแนะนำของ WebRequestManager ด้านล่าง) หากมีคำขอมากเกินไปที่จะเรียก คำขอที่มีลำดับความสำคัญปานกลางจะถูกเลือกให้ถูกเรียกก่อน
หากต้องการเปิดใช้งานการสนับสนุนบริการเว็บการโทรแบบแบตช์ในตัวของ Atlas คุณต้องลงทะเบียนตัวจัดการฝั่งเซิร์ฟเวอร์ก่อนสำหรับการประมวลผลการโทรแบบแบตช์ใน web.config (เทมเพลตเว็บไซต์ Atlas เริ่มต้นได้เปิดใช้งานตัวจัดการนี้):
<httpHandlers>
< เพิ่มกริยา = "*" path = "atlasbatchcall.axd" type = "Microsoft.Web.Services.MultiRequestHandler" ตรวจสอบ = "false"/>
</httpตัวจัดการ>
จากนั้นเพิ่มคำสั่งการแสดงผลของ WebRequestManager ไปยังสคริปต์ Atlas XML ของเพจ และตั้งค่าเพจให้อนุญาตการเรียกแบบแบตช์ไปยังบริการเว็บ: <script type="text/xml-script">
<เพจ xmlns:script=" http://schemas.microsoft.com/xml-script/2005 ">
<ส่วนประกอบ>
<webRequestManager batSize = "5" EnableBatching = "true" battDelay = "3000" />
</ส่วนประกอบ>
</หน้า>
</สคริปต์>
สิ่งที่คุณต้องใส่ใจที่นี่คือคุณสมบัติสามประการต่อไปนี้ของ WebRequestManager:
EnableBatching: ตั้งค่าว่าเพจจะอนุญาตการเรียกแบบแบตช์หรือไม่ ค่าเริ่มต้นเป็นเท็จ ที่นี่เราควรตั้งค่าให้เป็นจริง
batchSize: ตั้งค่าจำนวนคำขอสูงสุดที่รวมอยู่ในการโทรแบบแบตช์ ค่าเริ่มต้นคือ 5 เมื่อจำนวนคำขอที่จะเรียกเกินการตั้งค่านี้ คำขอแบทช์จะออกทันทีแม้ว่าจะไม่ถึงขีดจำกัดเวลาที่ตั้งไว้ในแบตช์ดีเลย์ก็ตาม
battDelay: ตั้งค่าขีดจำกัดเวลารอสำหรับการโทรแบบแบตช์ ค่าเริ่มต้นคือ 1,000 (มิลลิวินาที) เมื่อขีดจำกัดเวลารอเกินการตั้งค่านี้ คำขอแบทช์จะออกทันที แม้ว่าจะไม่ถึงจำนวนคำขอในขนาดแบทช์ก็ตาม
หลังจากการตั้งค่านี้ การเรียกแบบแบตช์จะถูกใช้กับทุกคำขอบริการเว็บในเพจ ดังนั้นสำหรับการโทรครั้งเดียว คุณควรระบุลำดับความสำคัญให้สูง
มาดูตัวอย่างกัน ขั้นแรก ให้เขียน Web Service ซึ่งมี Web Method ดังต่อไปนี้ พารามิเตอร์ทั้งสองแสดงถึงลำดับของงาน (เพื่อให้เราสามารถแยกแยะลำดับของการดำเนินการงานได้) และลำดับความสำคัญ:
[WebMethod]
สตริงสาธารณะ DoTask (int taskID, ลำดับความสำคัญ int)
-
ถ้า (ลำดับความสำคัญ < 0 || ลำดับความสำคัญ > 2)
โยนข้อยกเว้นใหม่ ("ลำดับความสำคัญสามารถเป็น 0, 1 หรือ 2 เท่านั้น!");
return string.Format("งาน (ID: {0}, ลำดับความสำคัญ: {1}) เสร็จสิ้นแล้ว", taskID, ลำดับความสำคัญ);
-
จากนั้นทำตามโค้ดที่จุดเริ่มต้นเพื่อเปิดใช้งานการเรียกแบบแบตช์ใน web.config และเพิ่ม WebRequestManager ลงในเพจ อย่าลืมว่าจำเป็นต้องมี ScriptManager บนเพจเพื่ออ้างอิงบริการเว็บที่กำหนดไว้ด้านบน: <atlas:ScriptManager ID= "scriptManager" runat=" เซิร์ฟเวอร์">
<บริการ>
<atlas:ServiceReference Path="SampleService.asmx" />
</บริการ>
</atlas:ScriptManager>
เพิ่มมาร์กอัป HTML ปุ่มนี้ใช้เพื่อทริกเกอร์การเรียกแบทช์ และ div ใช้เพื่อแสดงผลการโทร:
<input id="invoidTasks" type="button" value="Invoke Task Calls" onclick="return invokeTasks_onclick()" />
<div id="ผลลัพธ์"/>
สุดท้ายมีสคริปต์ JavaScript เพื่อเรียกใช้ Web Service:
ฟังก์ชั่น invoidTasks_onclick()
-
//ล้างข้อมูลเอาท์พุต
$('ผลลัพธ์').innerHTML = '';
ทำภารกิจ(1, 2);
ทำภารกิจ(1, 1);
ทำภารกิจ(2, 0);
}
var รหัสงาน = 0;
ฟังก์ชั่น DoTask (ครั้ง, ลำดับความสำคัญ)
-
สำหรับ (var i = 0; i < ครั้ง; ++i)
-
SampleService.DoTask(
รหัสงาน++,
ลำดับความสำคัญ,
{onMethodComplete: OnComplete, ลำดับความสำคัญ: ลำดับความสำคัญ }
-
-
-
functionOnComplete (ผลลัพธ์)
-
$('result').innerHTML += ผลลัพธ์ + "<br />";
-
โปรดสังเกตว่าเมธอด DoTask() ยอมรับพารามิเตอร์สองตัว: เวลาใช้เพื่อระบุจำนวนการโทร ลำดับความสำคัญใช้เพื่อระบุลำดับความสำคัญ และเราใช้ตัวแปรส่วนกลาง taskID เพื่อรักษาลำดับคำขอที่เพิ่มขึ้น
ในตัวอย่างนี้ ขั้นแรกเราเรียกใช้คำขอที่มีลำดับความสำคัญต่ำ จากนั้นคำขอที่มีลำดับความสำคัญปานกลาง และสุดท้ายคือคำขอที่มีลำดับความสำคัญสูงสองคำขอ
เนื่องจากลำดับความสำคัญสูงไม่ได้มีส่วนร่วมในการเรียกแบบแบตช์ สิ่งแรกที่คุณเห็นคือการส่งคืน:
เนื่องจากจำนวนลำดับความสำคัญปานกลางและต่ำทั้งหมดคือ 2 และยังไม่ถึง 5 จึง ถูกส่งหลังจากหน่วงเวลา 3,000 มิลลิวินาที:
คุณสามารถแก้ไข ลำดับการโทรและจำนวนการโทรในเมธอด invoidTasks_onclick() เพื่อวิเคราะห์วิธีการใช้การเรียกแบบแบตช์
สามารถดาวน์โหลดโปรแกรมตัวอย่างได้ที่นี่: