سؤال

أنا خلق Silverlight 2 واجهة المستخدم عن بعد الصك.هناك نوعان من المستخدمين المتزامنين في مواقع مختلفة التفاعل مع الصك (المشغل في الصك بعد عالم) و أي عدد من المراقبين المستخدمين عدم التفاعل معها, مجرد مشاهدة.ومع ذلك كان واحدا من اثنين من المستخدمين النشطين يتغير شيء يجب أن تكون هذه التغييرات تنعكس مباشرة في اليونسكو للإحصاء جميع المستخدمين ، مثلبالغسل أو تكبير صورة أو التأشير أو اختيار جزء من الصورة ، إضافة عناصر إلى مجموعة عرضها في عنصر تحكم listbox.داخل العميل استخدام المجموعات التي يمكن ملاحظتها بسهولة تعكس التغييرات التي قام بها المستخدم ، ولكن من الصعب رؤية التغييرات التي تم إجراؤها من قبل مستخدم آخر.أنا يمكن أن استطلاع التغييرات من كل عميل ولكن شيئا من هذا القبيل دفع الإخطارات سيكون أفضل.يجب على نطاق واسع بحثت عن أمثلة ولكن لم يتم العثور على أي شيء الذي هو تماما ما أريد.هناك كل أنواع من القضايا الأمنية مع سيلفرلايت التفاعل مع خدمات WCF التي تعني العديد من الأمثلة المحتملة فقط لا تعمل.أنا أساسا نفاد الوقت في هذا المشروع بحاجة إلى مساعدة سريعة.هل من أحد لديه أي اقتراح مناسب المثال البسيط الذي يوضح كيفية فعل هذا ؟ أنا مطور من ذوي الخبرة ولكن كان لتعليم نفسي Silverlight و خدمات WCF وليس هناك أحد في المنطقة من يعرف أي شيء عن هذه.حتى ثو' لقد فعلت قدرا كبيرا من ASP.NET العمل أنا لست ويب/جافا سكريبت المعلم.شكرا

هل كانت مفيدة؟

المحلول

ويتم دعم إشعار دفع في Silverlight 2 باستخدام دعم جديد WCF PollingDuplexHttpBinding. هناك نوعان من التجمعات تثبيتها مع SDK سيلفرلايت ( واحد ل Silverlight التطبيق واحد لخادم WCF ).

ولدي القليلة بلوق المشاركات وعينة كاملة تطبيق التي توضح كيفية 'دفع' التحديثات المالية من خادم تطبيق وحدة التحكم التي الذاتي يستضيف خدمة WCF للعملاء المتصلين. لكنه يظهر أيضا كيف أن كل عميل يمكن إضافة ملاحظات ضد المالية ويكون هذه المذكرات متزامنة (دفع من الخادم) لجميع العملاء المتصلين الآخرين.

وأحدث نسخة من العينة (الجزء 4) يوضح كيفية مزامنة التحديثات دفعت بين كل من سيلفرلايت وWPF العملاء الذين يستخدمون نقطتي الخادم على النحو التالي:

using System;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace StockServer
{
    public class StockServiceHost : ServiceHost
    {
        public StockServiceHost(object singletonInstance, params Uri[] baseAddresses)
            : base(singletonInstance, baseAddresses)
        {
        }

        public StockServiceHost(Type serviceType, params Uri[] baseAddresses)
            : base(serviceType, baseAddresses)
        {
        }

        protected override void InitializeRuntime()
        {
            this.AddServiceEndpoint(
                typeof(IPolicyProvider),
                new WebHttpBinding(),
                new Uri("http://localhost:10201/")).Behaviors.Add(new WebHttpBehavior());

            this.AddServiceEndpoint(
                typeof(IStockService),
                new PollingDuplexHttpBinding(),
                new Uri("http://localhost:10201/SilverlightStockService"));

            this.AddServiceEndpoint(
                typeof(IStockService),
                new WSDualHttpBinding(WSDualHttpSecurityMode.None),
                new Uri("http://localhost:10201/WpfStockService"));

            base.InitializeRuntime();
        }
    }
}

وعملاء WPF الاتصال إلى نقطة النهاية WSDualHttpBinding والعملاء سيلفرلايت الاتصال إلى نقطة النهاية PollingDuplexHttpBinding من خدمة WCF نفسها. يعرض التطبيق أيضا كيفية التعامل مع متطلبات السياسة وصول العميل سيلفرلايت.

يمكن للعملاء (سيلفرلايت أو WPF) إضافة ملاحظات ضد اسهم في واجهة المستخدم، وهذه الملاحظات نشر مرة أخرى إلى الخادم لتكون دفعت لجميع عملاء آخرين. وهذا يدل على اتصال في أي من الاتجاهين، ونأمل أن يؤدي كل الاتصالات اللازمة المطلوبة للتطبيق.

ويمكنك ان ترى لقطة من في تطبيق تجريبي يعمل هنا .

نصائح أخرى

لا am دفع فليكس في فان بوي أزياء, ولكن مسألة واقعا هذا هو نوع من العمارة نبني في كل المرن القائم على التطبيقات بشكل روتيني.هنا هو ما نقوم به في فليكس - لا شك أنه يمكن أن تكون مناسبة ترجمت إلى Silverlight:

نأخذ المكونات الثلاثة ودمجها معا لإنجاز هذه القدرة:

  1. المذنب نمط (HTTP متوافق طريقة للقيام خادم دفع الإخطارات - نظرة على ويكيبيديا لمزيد من المعلومات)
  2. الدائرة الرسائل المواضيع (نشر/المشترك طوابير)
  3. أدوبي BlazeDS بريمج

البند الأخير تنفذ المذنب نمط يدعم AMF كائن تنظيم (أدوبي ثنائي التسلسل شكل ActionScript3 الكائنات) ، و الجسور إلى قائمة انتظار الدائرة أو الموضوع.عندما سد إلى الموضوع ، ثم المتعددة فليكس العملاء يعمل في المتصفح يمكن بروكسي في المشتركين إلى الدائرة الموضوع.حتى إذا كان أي عميل تنشر رسالة (أو تعليمات برمجية من جانب الخادم تنشر في الموضوع) عميل كافة المشتركين لديهم رسالة دفعت لهم عن طريق BlazeDS و المذنب نمط التنفيذ.

فعال تحتاج إلى تحديد أو كتابة العنصر الذي يحقق ما BlazeDS لا.قد تحتاج أيضا إلى تنفيذ بعض التعليمات البرمجية العميل أن يتفاعل مع المذنب نمط من هذا مكون من جانب الملقم.

لا WCF دعم المذنب نمط ثنائي الاتجاه الرسائل?خصوصا حيث يتوافق HTTP المنفذ 80 أو المنفذ 443 SSL.يبدو أنك قد بدا بالفعل في ذلك و لم يتم العثور على أي شيء من أجل ثنائية الاتجاه الرسائل.لذا قد تحتاج إلى لفة الخاص بك الأكمام و القيام ببعض الترميز.

بعض الأشياء ملاحظة عن القيام خادم دفع إلى التطبيق على شبكة الإنترنت:

BlazeDS يدعم اثنين من وسائط الأولية من تنفيذ المذنب نمط (في الواقع هناك 3 خيار الاقتراع ولكن أنا تجاهل ذلك):

  1. طويلة الاقتراع
  2. تدفق HTTP

منذ فترة طويلة الاقتراع واحد يجب أن تجد أن أكثر عالميا مدعومة أن معظم متصفحات الويب.لذلك قد تبسيط فقط دعم في البداية.أو هل يمكن أن قضاء بعض الوقت لجعل رمز العميل الخاص بك في محاولة HTTP الجري الأولى والتحول إلى الاقتراع منذ فترة طويلة إذا لزم الأمر.

كما أن رسالة وسيط التي يمكن أن توفر نشر/suscribe capatibility ، قد تنظر في استخدام شكرا الدائرة.فهو مفتوح المصدر ومجاني مع المجتمع النشط الدعم (يمكنك شراء الدعم أيضا).بالإضافة يمكنك استخدام NMS لدمج كما .صافي العميل.

وجود وسيط رسالة يجلس في الطبقة المتوسطة هو في الواقع مهم لأنه سوف يكون مكان الرسائل إلى وضعها بأمان.إذا كان لديك عملاء يقومون الاقتراع منذ فترة طويلة ، كنت لا تريد لهم أن تفوت أي رسالة جديدة أثناء فترة عندما كنت غير متصل فعليا.

للنظر في شيء آخر في حجم حركة المرور العالية سيناريوهات (مئات أو آلاف من العملاء ، مثل موقع ويب على الإنترنت), تحتاج إلى أن يكون النهج إلى المذنب نمط قابلة للتوسع.

في فليكس/Java العالم ، BlazeDS بريمج (مفتوحة المصدر) تم تعديله للعمل مع نموذج غير متزامن.في جافا مأخذ المستمع يمكن أن يبنى استخدام NIO قنوات جافا التزامن المنفذ الخيط برك.هر ملقم ويب لديها NIO المستمع دعم متزامن بريمج 3.0 الأحداث.BlazeDS على وجه الخصوص تم تعديل, على الرغم من أن العمل مع رصيف ملقم ويب.خلاصة القول هي أن قابلية هذا غير متزامن النهج يعني واحد البدني خادم الويب يمكن تعزيز دعم ما يصل إلى حوالي 20 ، 000 المتزامنة المذنب-أسلوب اتصالات العميل.

انها كانت فترة من الوقت منذ أن كنت قد فعلت خطيرة .صافي البرمجة ولكن تستخدم io قدرات بكثير مثل جافا 1.1 إلا مع غير متزامن نتيجة معالج القدرة.هذا على الرغم ليست نفس الشيء مثل خلق غير متزامن مأخذ المستمعين عن طريق جافا NIO فضائية.أ NIO قناة تنفيذ دعم مئات الآلاف من اتصالات مأخذ التوصيل مع صغيرة نسبيا تجمع مؤشرات الترابط.ولكن في C#.صافي مرت سنتين أو ثلاث كبيرة الدورات - ربما كانت هناك جديد io قدرات وأضاف قابلة للمقارنة إلى NIO فضائية.

وأردت فقط أن أوضح أن PollingDuplexHttpBinding لا يطبق إعلامات "الحقيقية"، كما يكشف عن اسمها (الاقتراع). من MSDN وثائق :

<اقتباس فقرة>   

عند تكوين مع هذا الملزمة، العميل سيلفرلايت دوريا استطلاعات الخدمة على طبقة الشبكة، والشيكات لأي الرسائل الجديدة التي تريد خدمة لإرسال على قناة الاستدعاء. خدمة قوائم الانتظار كل الرسائل المرسلة على قناة الاستدعاء العميل وتوفر لهم العميل عند صناديق الاقتراع العميل الخدمة.

ولكن من أكثر كفاءة من الطريقة التقليدية في الاقتراع خدمة الإنترنت، منذ بعد كل انتخابات، فإن الخادم الحفاظ على قناة مفتوحة لفترة معينة من الزمن (1 مثلا دقيقة)، وإذا وصول الرسالة في ذلك الوقت وسوف مباشرة 'دفع' الرسالة إلى العميل. لدى العميل لتجديد مرارا وتكرارا الاتصال، فإنه لذلك اقول استطلاعات الخدمة.

إذا كنت ترغب في تنفيذ إخطارات دفعة حقيقية مع Silverlight أعتقد أنك بحاجة للعمل مع مآخذ، وأنا أوصي قراءة بعض بلوق وظائف دان Wahlin حول هذا الموضوع.

وبدلا من ذلك،

وإذا كنت ترغب في API سلفرليغت الأصلية مع عدم وجود وكلاء والجسور أو مزودات الويب المعنية يمكنك استخدام السكينة من وجهة نظري قنوات كما الوسيطة الرسائل الخاصة بك. تحقق من السكينة من وجهة نظري قنوات وموقع عرض لها. (آسف أنا مستخدم جديد وغير قادر على تقديم وصلات):

وأليكس

وتحرير: انها تعمل في الواقع على ما يرام. أنا حصلت على عض بشدة من "المتغير الخفي" في إغلاق: (

ولقد استخدمت PollingDuplex لSL2 وأعتقد أنه ليس جاهزا للانتاج حتى الان.

وبلدي المسألة الرئيسية تكمن في حقيقة أنه لا يميز على العملاء على نفس الجهاز. إذا قمت بتشغيل عملاء 2 ثم سوف واحد منهم لن تكون قادرة على استطلاع الخادم بعد الآن، وسوف يموت من المهلة. هناك جلسة الهوية التي تختلف عن عملاء 2 لكنه تجاهل تماما على جانب العميل.

وبالمثل، إذا كنت قتل عميل ومن ثم إنشاء واحدة جديدة بعد ذلك ثم عميل جديد سوف تحصل على التحديثات دفعة من العميل السابق لفترة من الوقت.

هل أي شخص يواجه نفس القضايا أم أنها ثابتة في SL3؟

والواقع ركضت بعض أكثر الرموز التجريبي، وأدركت أن لديك لسبب لتحديد InstanceContextMode وInstanceMode بحيث الخدمة الدورة على أساس وليس المفرد (بقدر ما استطيع ان اقول). هناك قضايا واضحة للأداء في قانون تجريبي بسيط هو أن سحبت.

ومن المؤسف جدا أن لم يكن توثيق هذا السلوك.

وجد

ومنظمتي تنفيذ 2.0 / WCF دفع سيلفرلايت أن يكون قليلا "ليست مستعدة لخوض الانتخابات"، على الأقل في ما كانوا يخططون لاستخدامها ل.

ولقد انتهى الأمر الذهاب مع XMPP / جابر، لأنها شكلت أكثر جيدا الوحش، ويمكنك تنفيذ ذلك بسهولة إلى حد ما في Silverlight، فقط عن طريق الحصول على بعض الموارد من الانترنت.

وأعتقد أن سيلفرلايت 3.0 ستنفذ أحدث شكلت أكثر جيدا تنفيذ / دفع، من ما استطيع ان اقول من المعلومات المتاحة للجمهور.

ووPollingDuplexHttpBinding هو على الأرجح الطريقة الأكثر أناقة للقيام بذلك.

واحد possilby أقل انخراطا البديل هو استخدام مأخذ TCP من العميل سيلفرلايت الخاصة بك. كلما أحد العملاء سيلفرلايت يحتاج إلى دفع تحديثا يمكنك إرسالها رسالة TCP الذي يحتوي على اسم الخدمة WCF التي يحتاجها للاتصال أو بعض الدول الأخرى خفيفة الوزن قطعة من المعلومات.

وأنا استخدم هذا النهج لتطبيق وأنها تعمل بشكل جيد.

واحد حل أبسط من ذلك بكثير وأكثر قوة في HTTP: //www.udaparts كوم / وثيقة / دروس / slpush.htm

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top