5

इसलिए मैंने क्लाइंट/सर्वर डब्ल्यूसीएफ बनाया। मैं जो चाहता हूं वह तब होता है जब मैं इस क्लाइंट से सर्वर को संदेश भेजता हूं और किसी भी कारण से कनेक्शन कटौती करता हूं, उदाहरण के लिए क्लाइंट बंद हो जाता है, यह क्लाइंट फिर से उपलब्ध होने पर प्रतिक्रिया कैसे प्राप्त कर सकता है?कनेक्शन कटौती के बाद डब्ल्यूसीएफ विश्वसनीय संदेश में सर्वर से प्रतिक्रिया प्राप्त करने के लिए

क्या कोई सत्र या क्लाइंट और सर्वर के बीच कुछ सेट करना संभव है?

मेरे क्लाइंट कोड है:

private static void Main(string[] args) 
{ 
    var client = new FlipCaseServiceClient("ReliableMessageService"); 
    var sd = new StringData { FirstName = "Turgut", LastName = "Kançeltik" }; 

    var fullName = client.GetFullName(ref sd); 

    Console.WriteLine(fullName); 
} 

मेरे सर्वर कोड है: सारांश में

[DeliveryRequirements(RequireOrderedDelivery = true)] 
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Single)] 
public class FlipCaseService : IFlipCaseService 
{ 
    public string GetFullName(ref StringData stringData) 
    { 
     var fullName = $"{stringData.FirstName} {stringData.LastName}"; 

     stringData.FullName = fullName; 
     return fullName; 
    } 
} 

और सर्वर कॉन्फ़िगरेशन:

<service behaviorConfiguration="ServiceBehaviorMetaData" name="FlipCaseService.FlipCaseService" > 
    <endpoint name="ReliableMessageService" address="flipcase/wsAddress" binding="wsHttpBinding" bindingConfiguration="BindingReliableMessaging" contract="FlipCaseService.IFlipCaseService" > 
    <identity> 
     <dns value="localhost" /> 
    </identity> 
    </endpoint> 
</service> 

<bindings> 
    <wsHttpBinding> 
    <binding name="BindingReliableMessaging"> 
     <reliableSession enabled="true" inactivityTimeout="00:10:00"/> 
    </binding> 
    </wsHttpBinding>  
</bindings> 

<behavior name="ServiceBehaviorMetaData"> 
    <serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:8080/flipcase/metadata" /> 
    <serviceDebug includeExceptionDetailInFaults="true" /> 
</behavior> 
+0

क्या आप विफलता पर कॉल को पुनः प्रयास नहीं कर सके? – Evk

+0

मैं सर्वर पर एक ही चीज़ को फिर से प्रगति नहीं करना चाहता हूं। –

+0

एक डब्ल्यूसीएफ सेवा डिफ़ॉल्ट रूप से स्टेटलेस है, और यह एक सेवा की प्रकृति है, लेकिन आप राज्य का उपयोग कर सकते हैं। वैसे भी, आपके परिदृश्य में, मुझे लगता है कि आप फिर से संसाधित करने से बचने के लिए अगली कॉल के परिणाम कैशिंग को हल कर सकते हैं। –

उत्तर

2

एक उचित दृष्टिकोण यहाँ अतुल्यकालिक अनुरोध उपयोग करने के लिए है -response। इसका मतलब है कि क्लाइंट सर्वर के काम को पूरा करने के लिए इंतजार नहीं करता है, सिर्फ अनुरोध को भूल जाता है और भूल जाता है। जब सर्वर पूरा हो जाता है, तो वह ऑपरेशन के परिणामों के साथ क्लाइंट को वापस कॉल करता है। विशेष रूप से डब्ल्यूसीएफ में यह प्राप्त करने के लिए डुप्लेक्स अनुबंध होते हैं: http://www.codeproject.com/Articles/491844/A-Beginners-Guide-to-Duplex-WCF

जब सर्वर प्रतिक्रिया तैयार होती है, तो यह ग्राहक को वितरित करने का प्रयास करती है। यदि यह विफल हो जाता है, तो सर्वर सफलतापूर्वक या कुछ टाइमआउट तक पहुंचने तक बाद में पुनः प्रयास कर सकता है।

यदि आप इस पैटर्न का पालन करते हैं, तो क्लाइंट के पास कुछ अद्वितीय पहचानकर्ता होना चाहिए, ताकि कनेक्शन को पुनर्स्थापित किया जा सके - सर्वर जानता है कि यह वही ग्राहक है और यह जानता है कि इस क्लाइंट द्वारा कौन से प्रतिक्रियाओं का इंतजार है।

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

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

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