2012-12-12 38 views
7

आखिरकार डब्ल्यूसीएफ डुप्लेक्स सिल्वरलाइट 4 क्लाइंट मतदान संदेशों के लिए 404 Not Found त्रुटियों को प्राप्त करना शुरू कर देता है, मतदान के बाद डब्लूसीएफ सेवा से सिल्वरलाइट क्लाइंट को भेजा गया था, कभी-कभी यह दूसरे चुनाव के लिए होता है कभी-कभी कनेक्टिविटी काम करता है या यहां तक ​​कि दिन भी, लेकिन ज्यादातर पहले मिनटों में विफल रहता है।डब्ल्यूसीएफ सिल्वरलाइट क्लाइंट को मतदान संदेश के लिए 404 नहीं मिला

! और MaxMessagesPerPoll डुप्लेक्स मोड का उपयोग करते समय यह समस्या दिलचस्प है कि सिल्वरलाइट 4 बग ज्ञात है और समाधान here और here का वर्णन किया गया है लेकिन मैं SingleMessagePerPoll मोड का उपयोग कर रहा हूं। एनीवे मैंने सुझाए गए ClientStack का उपयोग करने की कोशिश की लेकिन कुछ भी नहीं बदला।

जनरल प्रवाह:

  1. SL ग्राहक कार्यान्वित WCF सेवा विधि, प्रतिक्रिया
  2. फिर तुरंत SL ग्राहक सेवा करने के लिए सर्वेक्षण संदेश भेजने और उसके बाद दूसरे या Ns चुनाव संदेश

    System.Net.WebException: The remote server returned an error: NotFound

    के लिए अपवाद हो रही शुरू प्राप्त
  3. फिडलर केवल 404 एक सर्वेक्षण संदेश के लिए प्रतिक्रिया
  4. फिर क्लाइंट चैन नेल गलती घटना उठाया

मैं इस तरह के एक गलती के बाद SL ग्राहक फिर से कनेक्ट करने की कोशिश कर रहा हूँ, एक पुनः कनेक्ट पुन: प्रयास करें प्रवाह:

  1. हैंडल Faulted घटना
  2. सदस्यता समाप्त की तरह Closed/Closing/Opened/Opening
  3. बंद सभी चैनल घटनाओं try { close } catch { abort }
  4. का उपयोग कर एक सही तरीके से चैनल एक नए थ्रेड पोल थ्रेड में नीचे दिया गया है: (मुझे लगता है कि यह थोड़ा स्थिर काम करता है - see this article)
  5. 45-70 सेकंड
  6. ही DuplexChannelFactory<T> उदाहरण का उपयोग करते हुए एक नया चैनल बनाने रुको, सिर्फ प्रवेश के प्रयोजनों के सभी चैनल ईवेंट की सदस्यता
  7. निष्पादित WCF सेवा विधि

1-10 पुनर्प्रयास करने के बाद (~ 1-10 मिनट) क्लाइंट अंततः एक सर्वर से कनेक्ट होता है और सामान्य मतदान जारी रखता है।

डब्ल्यूसीएफ सेवा लॉग में मुझे लगता है कि यह सभी क्लींट अनुरोध प्राप्त करता है, बिना किसी अपवाद के संसाधित किया जाता है, इसलिए ऐसा लगता है कि सिल्वरलाइट क्लाइंट पक्ष पर कुछ होता है।

सामान्य जानकारी:

  • .NET फ्रेमवर्क 4.0
  • PollingDuplex
  • Async WCF तरीकों
  • आईआईएस 6।0 WCF सेवा की मेजबानी की
  • Silverligth 4 ग्राहक
  • ग्राहक ओएस: Windows XP SP2
  • सर्वर ओएस: Windows 2003 R2 SP2
  • NTLM प्रमाणीकरण
  • DuplexMode: SingleMessagePerPoll
  • एक अन्य WCF सेवा है जो मेरी सेवा काम शुरू करने से पहले अनुरोध/उत्तर देता है, यह डुप्लेक्स कनेक्टिविटी
  • एसएल क्लाइंट सेवा पर मैं सब कुछ यूआई में लॉग इन कर रहा हूं इसलिए सभी घटनाओं का प्रवाह देखें और प्रत्येक विशेष घटना के लिए समय लें
  • आईआईएस लॉग, सर्वर इवेंट लॉग में कोई त्रुटि नहीं

ग्राहक:

var binaryBinding = new BinaryMessageEncodingBindingElement(); 
binaryBinding.ReaderQuotas.MaxStringContentLength = int.MaxValue; 

var httpbindingElement = new HttpTransportBindingElement 
{ 
    MaxReceivedMessageSize = 131072 
}; 

var pollingDuplexBindingElement = new PollingDuplexBindingElement 
{ 
    ClientPollTimeout = new TimeSpan(0, 0, 1, 30), 
    InactivityTimeout = new TimeSpan(0, 8, 0, 0), 
}; 


_binding = new CustomBinding(
      pollingDuplexBindingElement, 
      binaryBinding, 
      httpbindingElement) 
     { 
      SendTimeout = new TimeSpan(0, 0, 0, 45), 
      CloseTimeout = new TimeSpan(0, 0, 0, 25), 
      ReceiveTimeout = new TimeSpan(0, 8, 0, 0), 
      OpenTimeout = new TimeSpan(0, 0, 0, 45) 
     }; 


httpbindingElement.AuthenticationScheme = AuthenticationSchemes.Negotiate; 
var endpoint = new EndpointAddress(_endpointAddress); 
_channelFactory = new DuplexChannelFactory<TWebService>(
         new InstanceContext(instanceOfClientServiceClass), 
         _binding, 
         endpoint); 


// then this factory used to create a new channels 
// Also for a new channel I'm setting OpTimeout 
var contextChannel = newChannel as IContextChannel; 
if (contextChannel != null) 
{ 
    contextChannel.OperationTimeout = TimeSpan.FromSeconds(45); 
} 

सर्वर:

  • WCF, PerSession, बहु-क्रम
  • सब कुछ धागा सुरक्षित
  • है निष्पादन
  • निष्पादन के दौरान कोई सर्वर सेवा अपवाद नहीं
  • प्रवेश का एक बहुत तो मैं क्या देखते हैं एक सेवा
  • सभी WCF निशान switchValue All साथ सक्षम हैं, संदिग्ध
<binding name="customName" 
      sendTimeout="00:01:00" 
      receiveTimeout="08:00:00" 
      openTimeout="00:01:00" 
      closeTimeout="00:00:35"> 
    <pollingDuplex 
     inactivityTimeout="08:00:00" 
     serverPollTimeout="00:01:00" /> 
     <binaryMessageEncoding /> 
      <httpTransport authenticationScheme="Ntlm" 
          maxReceivedMessageSize="131072">    
     </httpTransport> 
</binding> 

<behavior name="customBehavior"> 
     <dataContractSerializer maxItemsInObjectGraph="2147483647" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
     <serviceThrottling 
      maxConcurrentCalls = "500" 
      maxConcurrentSessions = "500" 
      maxConcurrentInstances = "500" /> 
</behavior> 
+0

चेक http://stackoverflow.com/questions/1521117/wcf-over-ssl-404-error –

+0

धन्यवाद, लेकिन मेरा मामला नहीं लगता है, मैं एसएसएल और मेरी सेवा का उपयोग नहीं कर रहा हूं कभी-कभी 404 दिनों के बिना काम करता हूं, लेकिन कभी-कभी काम नहीं कर सकता ठीक है 10 मिनट – sll

उत्तर

1

हालांकि इस पर वर्णित Stackoverflow Static constructor called twice for PerSession WCF service पोस्ट समस्या की जांच कर मैंने पाया कि Polling Duplex शुरू स्थिर काम कर रहा है जब मैं अंतर्निहित AppPool एकल कार्यकर्ता प्रक्रिया के बजाय 2 के रूप में पहले निर्दिष्ट किया गया था का उपयोग करने के लिए IIS विन्यास का बदला है। मुझे यकीन नहीं है कि 2 पहले से सेट क्यों किया गया था क्योंकि मेरे पास इस सर्वर का स्वामित्व नहीं है, लेकिन वैसे भी मेरे पास यही है - एक ही मशीन पर लॉन्च किए गए कई सिल्वरलाइट क्लाइंट स्थिर और चुनाव चुनाव चुनाव और 404 त्रुटियों में काम नहीं करते हैं, सभी क्लाइंट फिर से जुड़ते हैं 1 आईआईएस पुनरारंभ करने और पुन: उपयोग करने के बाद प्रयास ...मतदान द्वैध अस्थिर हो जाता है - जब आईआईएस की मेजबानी WCF AppPool जो एक से अधिक कार्यकर्ता प्रक्रिया है में रहता है: डॉ;

अधिक जानकारी के

टी एल के लिए Performance Application Pool Settings देखें। तो उच्च लोड आईआईएस के मामले में दूसरी प्रक्रिया शुरू हुई और दूसरी प्रक्रिया में भी डब्ल्यूसीएफ सेवा उदाहरण बनाना शुरू कर दिया, इसलिए जब मैं एक प्रक्रिया में क्लाइंट सत्र बनाया गया था तो स्थिति में भाग गया लेकिन ऐसा लगता है कि चुनाव कभी-कभी दूसरी प्रक्रिया तक पहुंच जाता है, जो वर्तमान के बारे में नहीं जानता कनेक्शन/सत्र इसलिए ऐसे संदेशों और संपूर्ण कनेक्शन गलती से इनकार करना शुरू करें।

तो मतदान द्वैध डिजाइन द्वारा एक भी आईआईएस सर्वर और AppPool के दायरे में कई प्रक्रियाओं भर में स्केलेबल नहीं है, दूसरे शब्दों में आप 1 से अधिक कार्यकर्ता प्रक्रिया है, तो - इस WebGarden पर्यावरण और duplex is not scalable across web farms and gardens

3

सब कुछ लगता है काम कर ठीक, तो शायद यह होने के लिए कुछ भी नहीं है पर चल रहा है एक नेटवर्क आधारभूत संरचना/विन्यास मुद्दा है (उदाहरण के लिए डीएनएस विन्यास)। होस्ट नाम के बजाय स्थानीय रूप से चल रहे या आईपी पते का उपयोग करते समय आपको एक ही समस्या मिलती है? यदि आप IIS में साइट पर कॉन्फ़िगर कई बाइंडिंग है (विवरण के लिए यहां देखें: http://blogs.msdn.com/b/rampo/archive/2008/02/11/how-can-wcf-support-multiple-iis-binding-specified-per-site.aspx)

इसी मुद्दे भी हो सकती है

एक और बात है कि कैसे आप सर्वर से ग्राहकों को नहीं भेजी है। यदि आप एक लूप में क्लाइंट को पुन: सक्रिय करते हैं और कॉलबैक विधियों को एक-एक करके कॉल करते हैं, तो आपको टाइमआउट मिल सकते हैं जो 404 के रूप में दिखाए जाएंगे। कॉलबैक आम तौर पर इसके बजाय पृष्ठभूमि धागे (एक प्रति ग्राहक) पर लगाया जाना चाहिए।

संचार के तरीके के आधार पर, यह डेडलॉक के कारण भी हो सकता है (जब यूआई थ्रेड संदेश/कॉलबैक भेजने और सेवा से प्राप्त करने में शामिल होता है)।

+0

लिंक के लिए धन्यवाद, अभी पढ़ना। आईआईएस में ~ 15 वीडी वाले एक साइट और कुछ में समान बोली लगाने के बाद समान बोली लगाई जाती है लेकिन विभिन्न बंदरगाहों पर। 1) क्लाइंट resposnes के संबंध में - मैं प्रति ग्राहक कनेक्शन – sll

+0

पर एकल सेवा का उपयोग कर रहा हूं और हमारे पास web.config – sll

+0

में सत्य पर सेट 'एकाधिकसाइट बाइंडिंग्स सक्षम' है, पृष्ठभूमि थ्रेड में कॉलबैक के संबंध में, क्या आप सुनिश्चित हैं कि यह UI- कम डब्ल्यूसीएफ सेवा? इसके अलावा मैंने पाया कि Silverligth क्लाइंट के मामले में async कॉलबैक करने का कोई तरीका नहीं है ?! वैसे भी मैं मैन्युअल रूप से यूआई थ्रेड को भेज रहा हूं और वहां कोई अपवाद नहीं आया है क्योंकि मैं उन्हें सभी को – sll