के साथ डब्ल्यूसीएफ डुप्लेक्स मतदान का उपयोग करते समय डेडलॉक मैंने डब्ल्यूसीएफ डुप्लेक्स मतदान वेब सेवा का उपयोग करने वाले चैट प्रोग्राम बनाने के लिए चांदी के टीवी पर टोमेक जांज़ुक के प्रदर्शन का पालन किया है। ग्राहक सर्वर की सदस्यता लेता है, और उसके बाद सर्वर सभी जुड़े क्लाइंट को ईवेंट प्रकाशित करने के लिए नोटिफिकेशन प्रारंभ करता है।सिल्वरलाइट
विचारधारा क्लाइंट पर सरल है, एक बटन है जो क्लाइंट को कनेक्ट करने की अनुमति देता है। एक टेक्स्ट बॉक्स जहां ग्राहक एक संदेश लिख सकता है और इसे प्रकाशित कर सकता है, और एक बड़ा टेक्स्ट बॉक्स जो सर्वर से प्राप्त सभी अधिसूचनाएं प्रस्तुत करता है।
मैंने 3 क्लाइंट (विभिन्न ब्राउज़रों में - आईई, फ़ायरफ़ॉक्स और क्रोम) को जोड़ा और यह सब अच्छी तरह से काम करता है। वे संदेश भेजते हैं और उन्हें आसानी से प्राप्त करते हैं। जब मैं ब्राउज़र में से किसी एक को बंद करता हूं तो समस्या तब शुरू होती है। जैसे ही एक ग्राहक बाहर निकलता है, अन्य ग्राहक अटक जाते हैं। वे सूचनाएं प्राप्त करना बंद कर देते हैं।
मुझे लगता है कि सर्वर में लूप जो सभी ग्राहकों के माध्यम से जाता है और उन्हें भेजता है, वह अधिसूचना भेजता है जो अब गायब है। मैंने अपवाद को पकड़ने और इसे क्लाइंट सूची से निकालने का प्रयास किया (कोड देखें) लेकिन यह अभी भी मदद नहीं करता है।
कोई विचार?
void client_NotifyReceived(object sender, ChatServiceProxy.NotifyReceivedEventArgs e)
{
this.Messages.Text += string.Format("{0}\n\n", e.Error != null ? e.Error.ToString() : e.message);
}
private void MyMessage_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
this.client.PublishAsync(this.MyMessage.Text);
this.MyMessage.Text = "";
}
}
private void Button_Click(object sender, RoutedEventArgs e)
{
this.client = new ChatServiceProxy.ChatServiceClient(new PollingDuplexHttpBinding { DuplexMode = PollingDuplexMode.MultipleMessagesPerPoll }, new EndpointAddress("../ChatService.svc"));
// listen for server events
this.client.NotifyReceived += new EventHandler<ChatServiceProxy.NotifyReceivedEventArgs>(client_NotifyReceived);
this.client.SubscribedReceived += new EventHandler<System.ComponentModel.AsyncCompletedEventArgs>(client_SubscribedReceived);
// subscribe for the server events
this.client.SubscribeAsync();
}
void client_SubscribedReceived(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
try
{
Messages.Text += "Connected!\n\n";
gsConnect.Color = Colors.Green;
}
catch
{
Messages.Text += "Failed to Connect!\n\n";
}
}
और वेब config इस प्रकार है:: स्थापित करने के लिए
<system.serviceModel>
<extensions>
<bindingExtensions>
<add name="pollingDuplex" type="System.ServiceModel.Configuration.PollingDuplexHttpBindingCollectionElement, System.ServiceModel.PollingDuplex, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</bindingExtensions>
</extensions>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<pollingDuplex>
<binding name="myPollingDuplex" duplexMode="MultipleMessagesPerPoll"/>
</pollingDuplex>
</bindings>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
<services>
<service name="ChatDemo.Web.ChatService">
<endpoint address="" binding="pollingDuplex" bindingConfiguration="myPollingDuplex" contract="ChatDemo.Web.ChatService"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
</system.serviceModel>
मैं अधिसूचना बहु बनाकर इस समस्या को वैकल्पिक हल करने की कोशिश की पिरोया। तो लूप में क्लाइंट को सूचित करने के बजाय, मैं थ्रेड-प्रति-क्लाइंट बनाता हूं और थ्रेड को क्लाइंट को सूचित करता हूं, इसलिए एक क्लाइंट को दूसरे की प्रतीक्षा नहीं करनी पड़ती है। ऐसा लगता है कि समस्या हल हो रही है, लेकिन अभी भी एक अजीब मुद्दा है। जब ग्राहक IE में चल रहा है, यदि 10 सेकंड के लिए कोई गतिविधि नहीं है, तो कनेक्शन मर चुका है। और अगली बार जब यह एक संदेश भेजने का प्रयास करता है तो यह संकेत देता है कि कनेक्शन दोषपूर्ण स्थिति में है। यह केवल आईई में होता है ... किसी को भी कोई विचार है? उत्तर के लिए –