المؤلف: Dflying Chen ( http://dflying.cnblog.som/ )
بالنسبة لبرنامج Atlas، نحتاج في بعض الحالات إلى الاتصال بعدد كبير من خدمات الويب في وقت قصير، مثل المستخدمين الموجودين في القائمة الذين ينقرون بسرعة للحذف . في هذا الوقت، غالبًا ما يتسبب النطاق الترددي للشبكة والاستقرار وما إلى ذلك في تأخيرات أطول. إذا كان من الممكن تجميع هذه المكالمات في طلب واحد، فسيحتاج المستخدمون فقط إلى تحمل تأخير واحد في الشبكة للحصول على نتائج المعالجة، مما يؤدي أيضًا إلى تحسين الكفاءة بشكل غير مباشر. يبدو أن هذه الوظيفة ليست سهلة التنفيذ، ولكن لحسن الحظ، يحتوي Atlas على دعم مدمج للاتصال المجمع بخدمات الويب، وكل ما تحتاجه هو إعداد بسيط في البرنامج.
يحتوي كل طلب استدعاء لخدمة ويب في Atlas على ثلاث أولويات: 0: عالية، و1: متوسطة، و2: منخفضة، والقيمة الافتراضية هي متوسطة.
عند الاتصال، يمكنك تحديد أولوية هذا الاستدعاء من خلال معلمة الأولوية (يُرجى الرجوع إلى: الاتصال بخدمة الويب في ASP.NET Atlas - معالجة الأخطاء والمهلات والاستجابة لعمليات إلغاء المستخدم). بالنسبة للمكالمات ذات الأولوية العالية، لا يطبق Atlas المكالمات المجمعة وسيرسل الطلب على الفور في كل مرة؛ أما بالنسبة للمكالمات ذات الأولوية المتوسطة والمنخفضة، فسيقوم Atlas بإنهاء المكالمات خلال فترة زمنية معينة (يرجى الرجوع إلى مقدمة WebRequestManager أدناه). ) في طلب واحد يتم إرسال الطلبات الفردية معًا، أو عندما يصل عدد الطلبات المطلوب استدعاؤها إلى رقم محدد (يرجى الرجوع إلى مقدمة WebRequestManager أدناه). إذا كان هناك عدد كبير جدًا من الطلبات المطلوب استدعاؤها، فسيتم تحديد الطلبات ذات الأولوية المتوسطة ليتم استدعاؤها أولاً.
لتمكين دعم خدمة الويب للمكالمات المجمعة المضمنة في Atlas، تحتاج أولاً إلى تسجيل المعالج من جانب الخادم لمعالجة المكالمات المجمعة في web.config (قام قالب موقع ويب Atlas الافتراضي بتمكين هذا المعالج):
<httpHandlers>
<إضافة فعل = "*" مسار = "atlasbatchcall.axd" نوع = "Microsoft.Web.Services.MultiRequestHandler" validate = "false"/>
</httpHandlers>
ثم قم بإضافة بيان العرض الخاص بـ WebRequestManager إلى برنامج Atlas XML النصي للصفحة وقم بتعيين الصفحة للسماح بالمكالمات المجمعة لخدمة الويب: <script type="text/xml-script">
<page xmlns:script=" http://schemas.microsoft.com/xml-script/2005 ">
<المكونات>
<webRequestManager BatchSize="5" EnableBatching="true" BatchDelay="3000" />
</المكونات>
</صفحة>
</script>
ما تحتاج إلى الانتباه إليه هنا هو الخصائص الثلاثة التالية لـ WebRequestManager:
EnableBatching: قم بتعيين ما إذا كانت الصفحة تسمح بالمكالمات المجمعة أم لا، والقيمة الافتراضية خاطئة. هنا يجب أن نضعه على أنه صحيح.
BatchSize: قم بتعيين الحد الأقصى لعدد الطلبات المضمنة في مكالمة مجمعة، القيمة الافتراضية هي 5. عندما يتجاوز عدد الطلبات المطلوب استدعاؤها هذا الإعداد، سيتم إصدار الطلب المجمع على الفور حتى إذا لم يتم الوصول إلى الحد الزمني المحدد في BatchDelay.
BatchDelay: قم بتعيين حد وقت الانتظار لمكالمة مجمعة. القيمة الافتراضية هي 1000 (ملي ثانية). عندما يتجاوز حد وقت الانتظار هذا الإعداد، سيتم إصدار الطلب المجمع على الفور حتى إذا لم يتم الوصول إلى عدد الطلبات في BatchSize.
بعد هذا الإعداد، سيتم تطبيق المكالمات المجمعة على كل طلب خدمة ويب في الصفحة. لذلك، بالنسبة لمكالمة واحدة، يجب عليك تحديد أولويتها على أنها عالية.
دعونا نلقي نظرة على مثال. أولاً، اكتب خدمة ويب، والتي تحتوي على أسلوب الويب التالي، يمثل المعلمان ترتيب المهمة (حتى نتمكن من التمييز بين ترتيب تنفيذ المهمة) والأولوية:
[WebMethod].
سلسلة DoTask العامة (int TaskID، أولوية int)
{
إذا (الأولوية <0 || الأولوية > 2)
رمي استثناء جديد("الأولوية يمكن أن تكون 0 أو 1 أو 2 فقط!");
return string.Format("المهمة (المعرف: {0}، الأولوية: {1}) انتهت."، معرف المهمة، الأولوية)؛
}
ثم اتبع الكود الموجود في البداية لتمكين الاستدعاءات المجمعة في web.config، وأضف WebRequestManager إلى الصفحة. لا تنس أن ScriptManager مطلوب أيضًا في الصفحة للإشارة إلى خدمة الويب المحددة أعلاه: <atlas:ScriptManager ID=. "scriptManager" runat = "الخادم">
<الخدمات>
<atlas:ServiceReference Path="SampleService.asmx" />
</الخدمات>
</atlas:ScriptManager>
إضافة علامات HTML. يتم استخدام الزر لتشغيل مكالمات مجمعة، ويتم استخدام div لعرض نتائج المكالمة:
<input id="invocateTasks" type="button" value="Invoc Task Calls" onclick="return invocateTasks_onclick()" />
<div معرف = "النتيجة"/>
وأخيرًا، يوجد برنامج JavaScript لاستدعاء خدمة الويب:
الوظيفة invocateTasks_onclick()
{
// مسح الإخراج
$('result').innerHTML = '';
DoTask(1, 2);
DoTask(1, 1);
DoTask(2, 0);
}
فار TaskID = 0;
وظيفة DoTask (الأوقات، الأولوية)
{
لـ (var i = 0; i < times; ++i)
{
سامبليسيرفيسي.دوتاسك (
معرف المهمة++،
أولوية،
{onMethodComplete: OnComplete، الأولوية: الأولوية }
);
}
}
دالة على الاكتمال (النتيجة)
{
$('result').innerHTML += result + "<br />";
}
لاحظ أن طريقة DoTask () تقبل معلمتين: يتم استخدام الأوقات لتحديد عدد المكالمات، ويتم استخدام الأولوية لتحديد الأولوية، ونستخدم معرف المهمة المتغير العام للحفاظ على تسلسل الطلب المتزايد.
في هذا المثال، قمنا أولاً باستدعاء طلب ذي أولوية منخفضة، ثم طلبًا ذو أولوية متوسطة، وأخيرًا طلبين ذوي أولوية عالية.
نظرًا لأن الأولوية العالية لا تشارك في المكالمات المجمعة، فإن أول شيء تراه هو عودتها:
نظرًا لأن إجمالي عدد الأولويات المتوسطة والمنخفضة هو 2 ولم يصل بعد إلى 5 ، فسيتم إرساله بعد تأخير قدره 3000 مللي ثانية:
يمكنك تعديل تسلسل الاتصال وعدد المكالمات في طريقة invocateTasks_onclick() لتحليل كيفية تنفيذ المكالمات المجمعة.
يمكن تنزيل نموذج البرنامج هنا: