المؤلف: Dflying Chen ( http://dflying.cnblogs.com/ )
في المقالة السابقة من هذه السلسلة (الاتصال بخدمة الويب في ASP.NET Atlas - مقدمة وتطبيق بسيط)، كنا على دراية بالطريقة الأساسية للاتصال بخدمة الويب في Atlas، ولكن في التطوير الفعلي، نقوم فقط بتقديم طلب والانتظار إرجاع النتائج ليس كافيًا، يحتاج معظمنا إلى التفكير في معالجة مهلات الأخطاء وما إلى ذلك، وكذلك السماح للمستخدمين بإلغاء العمليات. ولحسن الحظ، فإن تغليف Atlas لأسلوب الويب في خدمة الويب يأخذ أيضًا هذه الاحتياجات في الاعتبار بشكل كامل.
دعونا نعطي مثالاً لأسلوب الويب لتوضيحه، على سبيل المثال، لأسلوب الويب التالي:
public class ComplexWebService : System.Web.Services.WebService {
[WebMethod]
سلسلة عامة BadMethod (int DelayTime، bool throwException)
{
// شيء شيء
}
}
سيكون لمزيج JavaScript الذي تم إنشاؤه بواسطة Atlas التوقيع التالي: ComplexWebService.BadMethod(
تأخير الوقت,
رمي استثناء,
علىالطريقةالكاملة,
علىMethodTimeout,
علىMethodError,
onMethodAborted,
سياق المستخدم,
فترة المهلة,
أولوية،
استخدامGetMethod,
);
لاحظ أنه يتم استخدام المعلمتين في طريقة الويب كأول معلمتين لطريقة JavaScript بالترتيب، وهناك بعض المعلمات الإضافية:
onMethodComplete: يحدد اسم وظيفة رد الاتصال التي يتم تشغيلها عند اكتمال الطريقة وإرجاعها بنجاح. بشكل عام، يجب عليك دائمًا تحديد هذه الطريقة.
onMethodTimeout،: يحدد اسم الوظيفة التي يتم تشغيلها عند انتهاء مهلة تنفيذ الطريقة.
onMethodError: يحدد اسم الوظيفة التي يتم تشغيلها عندما تواجه الطريقة استثناءً أثناء التنفيذ.
onMethodAborted: حدد اسم الوظيفة التي يتم تشغيلها عندما يتم إلغاء الطريقة من قبل المستخدم أثناء التنفيذ.
userContext: كائن سياق المستخدم، والذي يمكن الوصول إليه في الوظائف الأربع المذكورة أعلاه.
timeoutInterval: قم بتعيين الحد الزمني للمهلة بالمللي ثانية. يبدو أن القيمة الافتراضية هي 90000. عادة لا توجد تغييرات مطلوبة.
الأولوية: قم بتعيين أولوية التنفيذ لهذه الطريقة. سيتم استخدام هذه الأولوية في عمليات AJAX المجمعة (المذكورة في المقالة التالية).
useGetMethod: سواء كنت تريد استخدام HTTP GET لإرسال الطلبات، فإن الإعداد الافتراضي هو خطأ.
يجب أن يكون ترتيب السمات الثمانية المذكورة أعلاه كما هو محدد. لكن في بعض الأحيان نحتاج فقط إلى تحديد معلمة لاحقًا بالترتيب، وعلينا كتابة المعلمات السابقة في نفس الوقت. لهذا السبب، يوفر لنا Atlas بشكل خاص طريقة اتصال أخرى، حيث يقوم بتمرير المعلمات الثمانية المذكورة أعلاه إلى الطريقة في شكل قاموس. على سبيل المثال، عندما نحتاج فقط إلى معلمات onMethodComplete وtimeoutInterval، فيمكننا الكتابة على النحو التالي:
ComplexWebService.BadMethod(
تأخير الوقت,
رمي استثناء,
{
onMethodComplete: معالج كامل،
الفاصل الزمني: 10000
}
);
حسنًا، دعنا نلقي نظرة على المعالجة الشائعة في وظائف رد الاتصال الأربع المذكورة أعلاه (onMethodComplete، وonMethodTimeout، وonMethodError، وonMethodAborted) في الظروف العادية من خلال مثال.
دعونا أولاً نكمل طريقة خدمة الويب في البداية:
استخدام System؛
باستخدام 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)
{
إذا (رمي استثناء)
{
رمي استثناء جديد("آسف، أنا لا أحب أن أفعل هذا!");
}
System.Threading.Thread.Sleep(delayTime);
العودة "تم!"؛
}
}
يمكنك أن ترى أن هذه الطريقة تحتوي على معلمتين: يحدد التأخير Time تأخير الطريقة، ويحدد throwException ما إذا كانت الطريقة ستطرح استثناءً. من خلال التحكم في هاتين المعلمتين والمعلمة timeoutInterval عند الاتصال، يمكننا محاكاة حالات الإكمال والمهلة والاستثناءات.
بعد ذلك، أضف ScriptManager إلى الصفحة وأضف مرجعًا إلى خدمة الويب هذه:
<atlas:ScriptManager ID="ScriptManager1" runat="server">
<الخدمات>
<atlas:ServiceReference Path="ComplexWebService.asmx" />
</الخدمات>
</atlas:ScriptManager>
قم بإضافة أربعة أزرار إلى صفحة ASPX لتشغيل الحالات الأربعة التالية: <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,
خطأ شنيع،
أونبادميثودمكومبليت,
علىBadMethodTimeout,
onBadMethodError,
onBadMethodAborted,
"بتنوركفاين_ونكليك"،
10000
);
}
وظيفة onBadMethodComplete (النتيجة)
{
تنبيه (نتيجة)؛
}
المهلة، حدد التأخير من جانب الخادم لمدة 3 ثوانٍ، ولكن تم ضبط المهلة على ثانية واحدة فقط:
function btnTimeOut_onclick() {
ComplexWebService.BadMethod(
3000،
خطأ شنيع،
أونبادميثودمكومبليت,
علىBadMethodTimeout,
onBadMethodError,
onBadMethodAborted,
"btnTimeOut_onclick"،
1000
);
}
وظيفة onBadMethodTimeout (طلب، userContext)
{
var timeoutString = "فشل الاتصال بـ '" + userContext + "' بسبب انتهاء المهلة!";
تنبيه (مهلة سلسلة)؛
}
استثناء، حدد الاستثناء الذي طرحه الخادم. لاحظ أنه يمكنك استخدام معلمة الاستجابة في وظيفة رد الاتصال للحصول على معلومات تفصيلية عن الخطأ:
function btnThrowException_onclick() {
ComplexWebService.BadMethod(
0,
حقيقي،
أونبادميثودمكومبليت,
علىBadMethodTimeout,
onBadMethodError,
onBadMethodAborted,
"btnThrowException_onclick"،
10000
);
}
وظيفة onBadMethodError (النتيجة، الاستجابة، userContext)
{
var errorString = "Test '" + userContext + "' فشل!";
إذا (النتيجة == فارغة) {
errorString += "رمز الحالة='" + Response.get_statusCode() + "'";
}
آخر {
سلسلة الأخطاء +=
" الرسالة ='" + result.get_message() +
"'rnstackTrace = " + result.get_stackTrace();
}
تنبيه (خطأ سلسلة)؛
}
إلغاء المستخدم، يشبه الإكمال العادي، ولكن باستخدام request.abort() لإلغاء العملية مباشرة بعد تقديم الطلب:
function btnCanceld_onclick() {
طلب فار = ComplexWebService.BadMethod(
2000،
خطأ شنيع،
أونبادميثودمكومبليت,
علىBadMethodTimeout,
onBadMethodError,
onBadMethodAborted,
"btnCancel_onclick"،
10000
);
request.abort();
}
وظيفة onBadMethodAborted(request, userContext) {
var errorString = "فشل الاستدعاء إلى '" + userContext + "'، وتم إحباط الطلب!";
تنبيه (خطأ سلسلة)؛
}
يمكن تنزيل نموذج البرنامج هنا: