ผู้แต่ง: Dflying Chen ( http://dflying.cnblogs.com/ )
ในบทความก่อนหน้าของชุดนี้ (การเรียกบริการเว็บใน ASP.NET Atlas - บทนำและแอปพลิเคชันอย่างง่าย) เราคุ้นเคยกับวิธีการพื้นฐานที่สุดในการเรียกบริการเว็บใน Atlas แต่ในการพัฒนาจริงเราเพียงแค่ทำการร้องขอและรอ การส่งคืนผลลัพธ์นั้นไม่เพียงพอ พวกเราส่วนใหญ่จำเป็นต้องพิจารณาการจัดการการหมดเวลาของข้อผิดพลาด ฯลฯ และยังอนุญาตให้ผู้ใช้ยกเลิกการดำเนินการอีกด้วย โชคดีที่การห่อหุ้ม Web Method ของ Atlas ใน Web Service ยังคำนึงถึงความต้องการเหล่านี้อย่างเต็มที่อีกด้วย
ให้เรายกตัวอย่าง Web Method เพื่ออธิบาย ตัวอย่างเช่น สำหรับ Web Method ต่อไปนี้:
public class ComplexWebService : System.Web.Services.WebService {
[WebMethod]
สตริงสาธารณะ BadMethod (int DelayTime, bool ThrowException)
-
//อะไรสักอย่าง
-
-
การรวม JavaScript ที่สร้างโดย Atlas จะมีลายเซ็นดังต่อไปนี้: ComplexWebService.BadMethod(
เวลาล่าช้า,
โยนข้อยกเว้น,
onMethod เสร็จสมบูรณ์,
onMethodหมดเวลา,
onMethodError,
onMethod ถูกยกเลิก,
บริบทผู้ใช้,
หมดเวลาช่วงเวลา,
ลำดับความสำคัญ,
ใช้GetMethod,
-
โปรดสังเกตว่าพารามิเตอร์สองตัวใน Web Method ถูกใช้เป็นพารามิเตอร์สองตัวแรกของวิธีการ JavaScript ตามลำดับ และมีพารามิเตอร์เพิ่มเติมบางตัว:
onMethodComplete: ระบุชื่อของฟังก์ชันการเรียกกลับที่ถูกทริกเกอร์เมื่อวิธีการเสร็จสมบูรณ์และส่งกลับสำเร็จ โดยทั่วไป คุณควรระบุวิธีนี้เสมอ
onMethodTimeout: ระบุชื่อฟังก์ชันที่จะถูกทริกเกอร์เมื่อการดำเนินการเมธอดหมดเวลา
onMethodError: ระบุชื่อฟังก์ชันที่จะถูกทริกเกอร์เมื่อเมธอดพบข้อยกเว้นระหว่างการดำเนินการ
onMethodAborted: ระบุชื่อของฟังก์ชันที่จะถูกทริกเกอร์เมื่อผู้ใช้ยกเลิกวิธีการระหว่างการดำเนินการ
userContext: วัตถุบริบทของผู้ใช้ซึ่งสามารถเข้าถึงได้ในสี่ฟังก์ชันข้างต้น
timeoutInterval: ตั้งค่าขีดจำกัดเวลาสำหรับการหมดเวลาเป็นมิลลิวินาที ค่าเริ่มต้นน่าจะเป็น 90000 โดยปกติแล้วไม่จำเป็นต้องทำการเปลี่ยนแปลงใดๆ
ลำดับความสำคัญ: กำหนดลำดับความสำคัญของการดำเนินการของวิธีนี้ ลำดับความสำคัญนี้จะใช้ในการดำเนินการ AJAX แบบแบตช์ (ดังที่กล่าวไว้ในบทความถัดไป)
useGetMethod: ไม่ว่าจะใช้ HTTP GET เพื่อส่งคำขอ ค่าเริ่มต้นจะเป็นเท็จ
ลำดับของแอตทริบิวต์ทั้งแปดข้างต้นจะต้องเป็นไปตามที่ระบุ แต่บางครั้งเราจำเป็นต้องระบุพารามิเตอร์ตามลำดับในภายหลังเท่านั้น และเราต้องเขียนพารามิเตอร์ก่อนหน้าพร้อมกัน ด้วยเหตุผลนี้ Atlas จึงจัดเตรียมวิธีการเรียกแบบอื่นให้เราโดยเฉพาะ โดยส่งพารามิเตอร์ทั้ง 8 ตัวข้างต้นไปยังวิธีการในรูปแบบของพจนานุกรม ตัวอย่างเช่น เมื่อเราต้องการเพียงพารามิเตอร์ onMethodComplete และ timeoutInterval เราสามารถเขียนได้ดังนี้:
ComplexWebService.BadMethod(
เวลาล่าช้า,
โยนข้อยกเว้น,
-
onMethodComplete: ตัวจัดการที่สมบูรณ์,
หมดเวลาช่วง: 10,000
-
);
ตกลง เรามาดูการประมวลผลทั่วไปในฟังก์ชันการโทรกลับสี่ฟังก์ชันข้างต้น (onMethodComplete, onMethodTimeout, onMethodError และ onMethodAborted) ภายใต้สถานการณ์ปกติผ่านตัวอย่าง
ขั้นแรกให้เราดำเนินการวิธีการบริการเว็บให้เสร็จสิ้นตั้งแต่เริ่มต้น:
การใช้ระบบ;
ใช้ 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 DelayTime, bool ThrowException)
-
ถ้า (throwException)
-
โยนข้อยกเว้นใหม่ ("ขออภัย ฉันไม่ชอบการทำเช่นนี้!");
-
System.Threading.Thread.Sleep (เวลาล่าช้า);
กลับ "เสร็จสิ้น!";
-
}
คุณจะเห็นว่าเมธอดนี้มีพารามิเตอร์สองตัว: DelayTime ระบุความล่าช้าของเมธอด และ ThrowException ระบุว่าเมธอดนั้นส่งข้อยกเว้นหรือไม่ ด้วยการควบคุมพารามิเตอร์ทั้งสองนี้และพารามิเตอร์ timeoutInterval เมื่อเรียกใช้ เราสามารถจำลองสถานการณ์ที่เสร็จสมบูรณ์ หมดเวลา และข้อยกเว้นได้
จากนั้น เพิ่ม ScriptManager ลงในเพจและเพิ่มการอ้างอิงไปยังบริการเว็บนี้:
<atlas:ScriptManager ID="ScriptManager1" runat="server">
<บริการ>
<atlas:ServiceReference Path="ComplexWebService.asmx" />
</บริการ>
</atlas:ScriptManager>
เพิ่มปุ่มสี่ปุ่มในหน้า ASPX เพื่อทริกเกอร์สี่สถานการณ์ต่อไปนี้: <div>
นี่เป็นวิธี BAD ซึ่งสามารถ:<br />
<input id="btnWorkFine" type="button" value="ทำงานได้ดี" onclick="return btnWorkFine_onclick()" />
<input id="btnTimeOut" type="button" value="หมดเวลา" onclick="return btnTimeOut_onclick()" />
<input id="btnThrowException" type="button" value="โยนข้อยกเว้น" onclick="return btnThrowException_onclick()" />
<input id="btnCanceld" type="button" value="get cancelled" onclick="return btnCanceld_onclick()" />
</div>
ดำเนินการเสร็จสิ้นตามปกติ เราระบุว่าไม่มีความล่าช้าหรือข้อยกเว้นในฝั่งเซิร์ฟเวอร์ และให้การหมดเวลาที่เหมาะสม (10 วินาที):
function btnWorkFine_onclick() {
ComplexWebService.BadMethod(
0,
เท็จ,
onBadMethod เสร็จสมบูรณ์,
onBadMethod หมดเวลา,
onBadMethodError,
onBadMethod ถูกยกเลิก,
"btnWorkFine_onclick",
10,000
-
-
ฟังก์ชั่น onBadMethodComplete (ผลลัพธ์)
-
การแจ้งเตือน (ผลลัพธ์);
-
หมดเวลา ระบุความล่าช้าฝั่งเซิร์ฟเวอร์ 3 วินาที แต่การหมดเวลาถูกตั้งค่าไว้ที่ 1 วินาทีเท่านั้น:
function btnTimeOut_onclick() {
ComplexWebService.BadMethod(
3000,
เท็จ,
onBadMethod เสร็จสมบูรณ์,
onBadMethod หมดเวลา,
onBadMethodError,
onBadMethod ถูกยกเลิก,
"btnTimeOut_onclick",
1,000
-
-
ฟังก์ชั่น onBadMethodTimeout (คำขอ, userContext)
-
var timeoutString = "การเรียกไปยัง '" + userContext + "' ล้มเหลวเนื่องจากการหมดเวลา!";
การแจ้งเตือน (หมดเวลาสตริง);
-
ข้อยกเว้น ระบุข้อยกเว้นที่ส่งมาจากเซิร์ฟเวอร์ โปรดทราบว่าคุณสามารถใช้พารามิเตอร์การตอบสนองในฟังก์ชันการโทรกลับเพื่อรับข้อมูลข้อผิดพลาดโดยละเอียด:
function btnThrowException_onclick() {
ComplexWebService.BadMethod(
0,
จริง,
onBadMethod เสร็จสมบูรณ์,
onBadMethod หมดเวลา,
onBadMethodError,
onBadMethod ถูกยกเลิก,
"btnThrowException_onclick",
10,000
-
-
ฟังก์ชั่น onBadMethodError (ผลลัพธ์, การตอบสนอง, บริบทผู้ใช้)
-
var errorString = "ทดสอบ '" + userContext + "' ล้มเหลว!";
ถ้า (ผลลัพธ์ == null) {
errorString += " รหัสสถานะ='" + response.get_statusCode() + "'";
-
อื่น {
ข้อผิดพลาดสตริง +=
" ข้อความ='" + result.get_message() +
"'rnstackTrace = " + result.get_stackTrace();
-
การแจ้งเตือน (errorString);
-
การยกเลิกผู้ใช้ คล้ายกับการเสร็จสิ้นตามปกติ แต่ใช้ request.abort() เพื่อยกเลิกการดำเนินการทันทีหลังจากทำการร้องขอ:
function btnCanceld_onclick() {
คำขอ var = ComplexWebService.BadMethod(
2000,
เท็จ,
onBadMethod เสร็จสมบูรณ์,
onBadMethod หมดเวลา,
onBadMethodError,
onBadMethod ถูกยกเลิก,
"btnCanceld_onclick",
10,000
-
คำขอ.ยกเลิก();
-
ฟังก์ชั่น onBadMethodAborted (คำขอ userContext) {
var errorString = "การเรียกไปยัง '" + userContext + "' ล้มเหลว คำขอถูกยกเลิก!";
การแจ้งเตือน (errorString);
}
สามารถดาวน์โหลดโปรแกรมตัวอย่างได้ที่นี่: