2009-03-12 23 views
20

मैं रिमोट वाद्ययंत्र में सिल्वरलाइट 2 यूजर इंटरफेस बना रहा हूं। उपकरण (ऑपरेटर और रिमोट वैज्ञानिक पर ऑपरेटर) के साथ बातचीत करने वाली विभिन्न साइटों पर दो समवर्ती उपयोगकर्ता हैं और पर्यवेक्षक उपयोगकर्ता इसके साथ बातचीत नहीं कर रहे हैं, बस देख रहे हैं। हालांकि, जब भी दो सक्रिय उपयोगकर्ता कुछ बदलते हैं तो इन परिवर्तनों को तुरंत सभी उपयोगकर्ताओं के यूआई में प्रतिबिंबित किया जाना चाहिए, उदा। किसी छवि को पैनिंग या ज़ूम करना या किसी छवि का हिस्सा चुनना, सूची सूची में प्रदर्शित संग्रह में आइटम जोड़ना। क्लाइंट के भीतर मैं अवलोकन संग्रह का उपयोग करता हूं जो उस उपयोगकर्ता द्वारा किए गए परिवर्तनों को आसानी से प्रतिबिंबित करता है, लेकिन किसी अन्य उपयोगकर्ता द्वारा किए गए परिवर्तनों को देखना कठिन होता है। मैं प्रत्येक ग्राहक से परिवर्तन के लिए मतदान कर सकता हूं लेकिन पुश अधिसूचनाओं की तरह कुछ बेहतर होगा। मैंने उदाहरणों के लिए व्यापक रूप से गुगल किया है लेकिन मुझे कुछ भी नहीं मिला जो मुझे चाहिए। डब्ल्यूसीएफ सेवाओं के साथ बातचीत करने वाले सिल्वरलाइट के साथ सभी प्रकार के सुरक्षा मुद्दे हैं, जिसका अर्थ है कि कई संभावित उदाहरण सिर्फ काम नहीं करते हैं। मैं अनिवार्य रूप से इस परियोजना पर समय से बाहर चला गया है और तेजी से मदद की ज़रूरत है। क्या किसी के पास एक उपयुक्त सरल उदाहरण का कोई सुझाव है जो दिखाता है कि यह कैसे करें? मैं एक अनुभवी डेवलपर हूं लेकिन मुझे खुद को सिल्वरलाइट और डब्ल्यूसीएफ सेवाओं को पढ़ाना पड़ा है और मेरे क्षेत्र में कोई भी नहीं है जो इनके बारे में कुछ जानता है। यहां तक ​​कि 'मैंने एएसपी.NET काम की उचित मात्रा में काम किया है, मैं एक वेब/जावास्क्रिप्ट गुरु नहीं हूं। धन्यवाद।सिल्वरलाइट और पुश नोटिफिकेशन

उत्तर

10

पुश अधिसूचना को नए डब्लूसीएफ मतदान डूप्लेक्स एचटीपी बाइंडिंग समर्थन का उपयोग करके सिल्वरलाइट 2 में समर्थित है। सिल्वरलाइट एसडीके (one for Silverlight app one for WCF server) के साथ दो असेंबली स्थापित हैं।

मेरे पास few blog posts and a full sample application है जो एक कंसोल एप्लिकेशन सर्वर से स्टॉक अपडेट को 'पुश' करने का तरीका दिखाता है जो कनेक्टेड क्लाइंट्स को डब्ल्यूसीएफ सेवा को स्वयं होस्ट करता है। यह भी दिखाता है कि प्रत्येक ग्राहक स्टॉक के खिलाफ नोट्स कैसे जोड़ सकता है और उन नोट्स को सिंक्रनाइज़ (सर्वर से धक्का) अन्य सभी कनेक्टेड क्लाइंट्स में कैसे जोड़ सकता है।

नमूना के नवीनतम संस्करण (भाग 4) दिखाता है कि इस प्रकार दो सर्वर अंतिमबिंदुओं का उपयोग कर दोनों Silverlight और 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 endpoint और सिल्वरलाइट ग्राहकों से कनेक्ट उसी डब्ल्यूसीएफ सेवा के मतदान डूप्लेक्स एचटीपी बाइंडिंग एंडपॉइंट से कनेक्ट करें। ऐप यह भी दिखाता है कि सिल्वरलाइट क्लाइंट एक्सेस पॉलिसी आवश्यकताओं को कैसे संभाला जाए।

ग्राहक (सिल्वरलाइट या डब्ल्यूपीएफ) अपने यूआई में स्टॉक के खिलाफ नोट्स जोड़ सकते हैं और ये नोट सभी अन्य ग्राहकों को धक्का देने के लिए सर्वर पर वापस प्रचारित करते हैं। यह किसी भी दिशा में संचार प्रदर्शित करता है और उम्मीद है कि आपके ऐप के लिए आवश्यक सभी आवश्यक संचार करता है।

आप demo application running here का एक स्क्रीनशॉट देख सकते हैं।

+1

मतदान नहीं करता है डुप्लेक्सहेटप बाइंडिंग मतदान द्वारा अपने "धक्का" को लागू करती है, इसलिए नाम? – gbjbaanb

+1

यह सीओएमईटी शैली का दीर्घकालिक HTTP कनेक्शन का उपयोग करता है, इसलिए तकनीकी रूप से यह मतदान होता है लेकिन क्योंकि मतदान लूप इतना लंबा होता है (जब कोई डेटा नहीं होता है) यह सर्वर के साथ कॉलबैक पंजीकृत करने के समान होता है। – luke

6

प्रशंसक लड़के के फैशन में फ्लेक्स को धक्का नहीं दे रहा है, लेकिन वास्तव में यह एक तरह का आर्किटेक्चर है जिसे हम नियमित रूप से हमारे सभी फ्लेक्स-आधारित अनुप्रयोगों में बनाते हैं। यहाँ है कि हम क्या फ्लेक्स पर करते हैं - कोई संदेह नहीं है यह उपयुक्त रूप सिल्वरलाइट में अनुवाद किया जा सकता है:

हम तीन सामग्री लेने के लिए और एक साथ यह क्षमता हासिल करने के लिए उन्हें एकीकृत:

  1. धूमकेतु पैटर्न (करने के लिए एक HTTP संगत तरीका सर्वर पुश नोटिफिकेशन - अधिक जानकारी के लिए विकिपीडिया पर देखो)
  2. JMS मैसेजिंग विषयों (प्रकाशित करें/ग्राहक कतारों)
  3. एडोब BlazeDS सर्वलेट

बाद वाला आइटम धूमकेतु पैटर्न लागू करता है, एएमएफ ऑब्जेक्ट मार्शलिंग (एक्शनस्क्रिप्ट 3 ऑब्जेक्ट्स के लिए एडोब का बाइनरी सीरियलाइजेशन प्रारूप), और जेएमएस कतार या विषय के पुल का समर्थन करता है। किसी विषय पर ब्रिजिंग करते समय, ब्राउज़र में चल रहे कई फ्लेक्स क्लाइंट को जेएमएस विषय के रूप में ग्राहकों के रूप में प्रॉक्सी किया जा सकता है। इसलिए यदि कोई क्लाइंट कोई संदेश प्रकाशित करता है (या सर्वर-साइड कोड विषय में प्रकाशित होता है), तो सभी ग्राहक ग्राहकों के पास ब्लेज़डीएस और धूमकेतु पैटर्न कार्यान्वयन के माध्यम से उन्हें संदेश भेजा जाएगा।

प्रभावी रूप से आपको उस घटक को ढूंढने या लिखने की आवश्यकता है जो BlazeDS करता है। आपको कुछ क्लाइंट कोड को भी लागू करने की आवश्यकता हो सकती है जो इस सर्वर-साइड घटक के धूमकेतु पैटर्न से इंटरैक्ट करते हैं।

क्या डब्ल्यूसीएफ धूमकेतु पैटर्न और द्वि-दिशात्मक संदेश का समर्थन करता है? खासकर जहां एसएसएल के लिए HTTP और पोर्ट 80 या पोर्ट 443 का अनुपालन करता है। ऐसा लगता है कि आप पहले से ही उसमें देख चुके हैं और द्वि-दिशात्मक संदेश के लिए कुछ भी नहीं मिला है। तो आपको अपनी आस्तीन को रोल करने और कुछ कोडिंग करने की आवश्यकता हो सकती है।

कुछ एक वेब अनुप्रयोग के लिए सर्वर धक्का कर रही है, उसके बारे में बातें:

BlazeDS धूमकेतु पैटर्न लागू करने के दो प्राथमिक मोड का समर्थन करता है (वहाँ वास्तव में एक 3 मतदान विकल्प नहीं है, लेकिन यह अनदेखी कर रहा हूँ):

  1. लंबे समय से मतदान
  2. HTTP

लंबे समय से मतदान की सबसे अधिक वेब ब्राउज़र को अधिक सार्वभौमिक समर्थन-होना करने के लिए मिल चाहिए स्ट्रीमिंग। तो आप शुरुआत में केवल समर्थन करने के लिए सुव्यवस्थित हो सकते हैं। या आप अपना क्लाइंट कोड पहले HTTP स्ट्रीमिंग करने का प्रयास करने के लिए समय व्यतीत कर सकते हैं और यदि आवश्यक हो तो लंबी-मतदान पर स्विच कर सकते हैं।

एक संदेश ब्रोकर के रूप में जो प्रकाशित/संदिग्ध क्षमता प्रदान कर सकता है, आप ActiveMQ JMS का उपयोग करने पर विचार कर सकते हैं। यह खुला स्रोत है और सक्रिय समुदाय समर्थन के साथ मुक्त है (आप भी समर्थन खरीद सकते हैं)। इसके अलावा आप .NET क्लाइंट के रूप में एकीकृत करने के लिए एनएमएस का उपयोग कर सकते हैं।

मध्य-स्तर में बैठे संदेश संदेश ब्रोकर होने के कारण वास्तव में महत्वपूर्ण है क्योंकि यह संदेशों को सुरक्षित रूप से रखा जा सकता है। यदि आपके ग्राहक लंबे मतदान कर रहे हैं, तो आप नहीं चाहते हैं कि वे अंतराल के दौरान किसी भी नए संदेश को याद न करें जब वे वास्तव में कनेक्ट नहीं होते हैं।

उच्च ट्रैफिक वॉल्यूम परिदृश्य (सैकड़ों या हजारों क्लाइंट, जैसे कि इंटरनेट पर एक वेबसाइट) में विचार करने के लिए एक और बात, आपको धूमकेतु पैटर्न के लिए एक दृष्टिकोण होना चाहिए जो स्केलेबल है।

फ्लेक्स/जावा दुनिया में, ब्लेज़डीएस सर्वलेट (जो खुला स्रोत है) को एसिंक्रोनस मॉडल के साथ काम करने के लिए संशोधित किया गया है। जावा में एक सॉकेट श्रोता एनआईओ चैनल और जावा कंसुरेंसी एक्जिक्यूटर थ्रेड पूल का उपयोग करने के लिए बनाया जा सकता है। टॉमकैट वेब सर्वर में एनआईओ श्रोता और एसिंक्रोनस सर्वलेट 3.0 घटनाओं के लिए समर्थन है। विशेष रूप से BlazeDS को जेटी वेब सर्वर के साथ काम करने के लिए संशोधित किया गया है। निचली पंक्ति यह है कि इस एसिंक्रोनस दृष्टिकोण की स्केलेबिलिटी का मतलब है कि लगभग 20,000 समवर्ती धूमकेतु-शैली क्लाइंट कनेक्शनों का समर्थन करने के लिए एक भौतिक वेब सर्वर को बढ़ाया जा सकता है।

यह कुछ समय हो गया है क्योंकि मैंने गंभीर .NET प्रोग्रामिंग किया है, लेकिन आईओ क्षमताओं के लिए उपयोग किया गया था, एसिंक्रोनस परिणाम हैंडलर क्षमता को छोड़कर जावा 1.1 की तरह था। हालांकि, यह जावा एनआईओ चैनलों के माध्यम से एसिंक्रोनस सॉकेट श्रोताओं को बनाने जैसा ही नहीं है। एक एनआईओ चैनल कार्यान्वयन अपेक्षाकृत छोटे थ्रेड पूल के साथ सैकड़ों से हजारों सॉकेट कनेक्शन का समर्थन कर सकता है। लेकिन सी # और .NET दो या तीन महत्वपूर्ण संशोधन के माध्यम से चला गया है - शायद नई आईओ क्षमताओं को जोड़ा गया है जो एनआईओ चैनलों के बराबर हैं।

0

पोलिंग ड्यूप्लेक्सहेटप बाइंडिंग शायद ऐसा करने का सबसे शानदार तरीका है।

आपके पास सिल्वरलाइट क्लाइंट से एक टीसीपी सॉकेट का उपयोग करने के लिए एक कम विकल्प शामिल है। जब भी सिल्वरलाइट क्लाइंटों में से एक को अद्यतन अपडेट करने की आवश्यकता होती है तो आप इसे एक टीसीपी संदेश भेज सकते हैं जिसमें डब्ल्यूसीएफ सेवा का नाम होता है जिसे उसे कॉल करने की आवश्यकता होती है या जानकारी के कुछ अन्य हल्के वजन टुकड़े होते हैं।

मैं इस एप्लिकेशन का उपयोग किसी एप्लिकेशन के लिए करता हूं और यह अच्छी तरह से काम करता है।

1

मेरे संगठन ने सिल्वरलाइट 2.0/डब्ल्यूसीएफ पुश कार्यान्वयन को कम से कम "प्राइम टाइम के लिए तैयार नहीं" पाया, कम से कम हम इसका उपयोग करने की योजना बना रहे थे।

हम एक्सएमपीपी/जैबर के साथ जा रहे हैं, क्योंकि यह एक अधिक अच्छी तरह से गठित जानवर है, और आप सिल्वरलाइट में इसे आसानी से इंटरनेट से कुछ संसाधन प्राप्त करके इसे आसानी से कार्यान्वित कर सकते हैं।

मुझे विश्वास है कि सिल्वरलाइट 3.0 सार्वजनिक रूप से उपलब्ध जानकारी से जो कुछ भी बता सकता हूं, उससे एक नया/अधिक अच्छी तरह से गठित पुश कार्यान्वयन लागू करेगा।

2
वैकल्पिक रूप से

,

अगर आप कोई प्रॉक्सी, पुल या वेबसर्वर को शामिल आप अपनी संदेश सेवा मध्यस्थ के रूप में मेरे-चैनल से निर्वाण इस्तेमाल कर सकते हैं के साथ एक देशी Silverlight एपीआई चाहते हैं। मेरे चैनलों और उनकी शोकेस साइट से निर्वाण देखें। (माफ करना, मैं एक नया उपयोगकर्ता हूँ और नहीं कर सकते लिंक पेश करें):

एलेक्स स्थल पर

+0

हम चांदी की रोशनी के साथ निर्वाण का उपयोग करते हैं, यह बहुत अच्छा है। :) – RhysC

2

संपादित करें: यह वास्तव में ठीक काम कर रहा है। मैं बुरी तरह से "छिपा चर" को बंद करने :(

मैं SL2 के लिए PollingDuplex इस्तेमाल किया में ने काट लिया गया और मुझे लगता है कि यह अभी तक उत्पादन के लिए तैयार नहीं है।

मेरे मुख्य मुद्दा यह है कि ऐसा नहीं है ' टी एक ही मशीन पर ग्राहकों पर भेदभाव नहीं करते हैं। अगर मैं 2 क्लाइंट चलाता हूं तो उनमें से एक अब सर्वर को मतदान नहीं कर पाएगा और टाइमआउट के मर जाएगा। एक सत्र आईडी है जो 2 ग्राहकों के लिए अलग है लेकिन इसे अभी अनदेखा किया गया है क्लाइंट साइड पर

इसी तरह, अगर मैं एक क्लाइंट को मारता हूं और फिर एक नया बना देता हूं तो नए क्लाइंट को कुछ समय के लिए पिछले क्लाइंट से पुश अपडेट मिलेंगे।

क्या किसी को भी एक ही समस्या का सामना करना पड़ा है या क्या वे एसएल 3 में तय हैं?

वास्तव में मैंने कुछ और डेमो कोड चलाए और महसूस किया कि किसी कारण से आपको InstanceContextMode और InstanceMode निर्दिष्ट करना है ताकि सेवा सत्र आधारित हो और एक सिंगलटन (जहां तक ​​मैं बता सकता हूं)। मैंने खींचे गए सरल डेमो कोड में स्पष्ट प्रदर्शन समस्याएं हैं।

यह बहुत दुर्भाग्यपूर्ण है कि इस व्यवहार को दस्तावेज नहीं किया गया था।

3

मैं सिर्फ यह स्पष्ट करना चाहता था कि मतदान डूप्लेक्सहटप बाइंडिंग 'सत्य' पुश सूचनाओं को लागू नहीं करती है, जैसा कि इसका नाम बताता है (मतदान)।

जब ऐसा बंधन, Silverlight ग्राहक समय-समय पर किसी भी नए संदेश है कि सेवा कॉलबैक चैनल पर भेजना चाहती है के लिए चुनाव नेटवर्क परत पर सेवा, और चेक के साथ विन्यस्त: msdn documentation से। सेवा क्लाइंट कॉलबैक चैनल पर भेजे गए सभी संदेशों को कतार देती है और क्लाइंट को सेवा के दौरान क्लाइंट को भेजती है।

हालांकि यह एक वेब सेवा मतदान के पारंपरिक तरीके से अधिक कुशल है, क्योंकि प्रत्येक मतदान के बाद, सर्वर एक निश्चित समय के लिए चैनल खोल देगा (1 मिनट कहें), और यदि कोई संदेश उसमें आता है समय यह सीधे ग्राहक को संदेश 'धक्का' देगा। क्लाइंट को बार-बार अपने कनेक्शन को नवीनीकृत करना पड़ता है, इसलिए यह सेवा को चुनाव कहना है।

यदि आप चांदी की रोशनी के साथ वास्तविक पुश नोटिफिकेशन को कार्यान्वित करना चाहते हैं तो मुझे विश्वास है कि आपको सॉकेट के साथ काम करने की ज़रूरत है, और मैं विषय पर डैन वाहिलिन के कुछ ब्लॉग पोस्ट पढ़ने की सलाह देता हूं।

संबंधित मुद्दे