को संभालने का सबसे अच्छा तरीका मेरे पास एक वास्तविक समय ऐप है जो देश भर में कई साइटों के आसपास संपत्तियों को ट्रैक करता है। इस समाधान के हिस्से के रूप में मेरे पास 8 क्लाइंट ऐप्स हैं जो केंद्रीय सर्वर को अपडेट करते हैं।डब्ल्यूसीएफ टाइमआउट
मेरा सवाल यह है कि कभी-कभी ऐप्स केंद्रीय सर्वर से कनेक्शन खो देते हैं और मैं सोच रहा हूं कि इससे निपटने का सबसे अच्छा तरीका क्या है? मुझे पता है कि मैं टाइमआउट से निपटने के लिए अधिकतम प्रेषण/प्राप्त करने के समय को बढ़ा सकता हूं लेकिन सर्वर से कनेक्शन नीचे होने पर भी निपटने के लिए एक सुखद समाधान चाहिए:
उदाहरण के लिए मैं अपनी सेवाओं को इस तरह बुला रहा हूं :
using (var statusRepository = new StatusRepositoryClient.StatusRepositoryClient())
{
statusId = statusRepository.GetIdByName(licencePlateSeen.CameraId.ToString());
}
मैं आज़माएं/कैच तो जोड़ने के बारे में सोच रहा था ...
using (var statusRepository = new StatusRepositoryClient.StatusRepositoryClient())
{
try
{
statusId = statusRepository.GetIdByName(licencePlateSeen.CameraId.ToString());
}
catch (TimeoutException timeout)
{
LogMessage(timeout);
}
catch (CommunicationException comm)
{
LogMessage(comm);
}
}
यह इस तरह से मुझे कोड दोहराने के लिए ढेर बिना कोड को फिर से चलाएं करने की अनुमति नहीं निपटने। किसी को भी कोई सुझाव मिला है?
संपादित करें: सिक्सटो सैज़ और उपयोगकर्ता 24601 उत्तरों में एक समग्र समाधान होने पर एक व्यक्तिगत अपवाद स्तर पर टाइमआउट से निपटने से बेहतर है लेकिन ... मैं सोच रहा था कि नीचे मेरी समस्या का समाधान होगा (लेकिन यह एक जोड़ देगा अतिरिक्त कोड त्रुटि हैंडलिंग का टन):
void Method(int statusId)
{
var statusRepository = new StatusRepositoryClient.StatusRepositoryClient()
try
{
IsServerUp();
statusId = statusRepository.GetIdByName(licencePlateSeen.CameraId.ToString());
statusRepository.Close();
}
catch (Exception ex)
{
statusRepository.Abort();
if (ex is TimeoutException || ex is CommunicationException)
{
LogMessage(timeout);
Method(statusId);
}
else
{
throw new Exception(ex.Message + ex.InnerException);
}
}
}
}
bool IsServerUp()
{
var x = new Ping();
var reply = x.Send(IPAddress.Parse("127.0.0.1"));
if (reply == null)
{
IsServerUp();
}
else
{
if (reply.Status != IPStatus.Success)
{
IsServerUp();
}
}
return true;
}
आप एक ऐसा फ़ंक्शन लिख सकते हैं जो सर्वर के ऊपर परीक्षण करता है, इस प्रकार आप यह जांच सकते हैं कि सर्वर आपके पास रिपोजिटरी से कनेक्शन बनाने से पहले है या नहीं। सर्वर ऊपर होने तक आप एक नज़र में भी जा सकते हैं। – Jethro
तो एक रिकर्सिव फ़ंक्शन बनाएं जो सर्वर तक तब तक बाहर नहीं निकलता है जब तक कि जारी रहे ... और किसी भी डब्ल्यूसीएफ कॉल से पहले कॉल पॉप करें? मुझे विचार पसंद है और यह ऊपर वर्णित संपादन से कम कोड होगा .. आपका विचार निश्चित रूप से विश्वसनीयता 99% में सुधार करता है लेकिन अगर सर्वर चेक और विधि कॉल के बीच कनेक्शन खो देता है तो मैं कैसे निपटूं? –
@ जेथ्रो: सर्वोत्तम अभ्यास पिंग विधि के खिलाफ सलाह देते हैं। यहां चर्चा देखें: http://stackoverflow.com/questions/2166356/how-to-check-if-a-wcf-service-is-operational मूलभूत विचार यह है कि टाइमआउट सेवा निर्भरता का परिणाम हो सकता है जो होगा एक पिंग इवेंट में दिखाई नहीं दे रहा है (जैसे एक डब्ल्यूसीएफ सेवा जो डाटाबेस के साथ इंटरैक्ट करता है जहां डेटाबेस टाइमआउट का कारण बनता है) – VoteCoffee