2012-12-13 8 views
10

मैं एक .NET दूरस्थ सेवा जो ठीक समय के सबसे अधिक काम करता है का जवाब देने बंद हो जाता है। अगर कोई अपवाद या त्रुटि होती है, तो यह त्रुटि को फ़ाइल में लॉग करता है लेकिन फिर भी चल रहा है।नेट दूरस्थ सेवा उचित रूप में दुर्घटनाओं, और ग्राहकों

हालांकि, के बारे में एक बार जो निम्न संदेश के साथ एक SocketException साथ दुर्घटना ग्राहक appication का कारण बनता है हर दो हफ्ते में सेवा ग्राहकों के लिए जवाब बंद हो जाता है,:

A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond 

कोई अपवाद या स्टैक ट्रेस हमारे लॉग में लिखा है फ़ाइल, इसलिए मैं यह नहीं समझ सकता कि सेवा कहां दुर्घटनाग्रस्त हो रही है, जिससे मुझे विश्वास होता है कि यह मेरे कोड के बाहर कहीं भी असफल रहा है। इस दुर्घटना के मूल कारण को जानने के लिए मैं क्या अतिरिक्त कदम उठा सकता हूं? मैं कल्पना करता हूं कि यह किसी इवेंटलॉग को कहीं लिखता है, लेकिन मैं विंडोज़ इवेंट लॉगिंग सिस्टम से बहुत परिचित नहीं हूं इसलिए मुझे बिल्कुल यकीन नहीं है कि कहां देखना है।

इस के लिए कोई सहायता के लिए अग्रिम धन्यवाद।

संपादित करें: सेवा का उल्लेख करना, रोकना या पुनरारंभ करना कुछ भी नहीं है, सेवा कभी प्रतिक्रिया नहीं देती है। सेवा शुरू करने से पहले मुझे प्रक्रिया को मैन्युअल रूप से मारने की ज़रूरत है।

संपादित करें 2:

public class ClientInfoServerSinkProvider : 
     IServerChannelSinkProvider 
    { 
     private IServerChannelSinkProvider _nextProvider = null; 

     public ClientInfoServerSinkProvider() 
     { 
     } 

     public ClientInfoServerSinkProvider(
       IDictionary properties, 
       ICollection providerData) 
     { 
     } 

     public IServerChannelSinkProvider Next 
     { 
     get { return _nextProvider; } 
     set { _nextProvider = value; } 
     } 

     public IServerChannelSink CreateSink(IChannelReceiver channel) 
     { 
     IServerChannelSink nextSink = null; 

     if (_nextProvider != null) 
     { 
      nextSink = _nextProvider.CreateSink(channel); 
     } 
     return new ClientIPServerSink(nextSink); 
     } 

     public void GetChannelData(IChannelDataStore channelData) 
     { 
     } 
    } 

    public class ClientIPServerSink : 
     BaseChannelObjectWithProperties, 
     IServerChannelSink, 
     IChannelSinkBase 
    { 

     private IServerChannelSink _nextSink; 

     public ClientIPServerSink(IServerChannelSink next) 
     { 
     _nextSink = next; 
     } 

     public IServerChannelSink NextChannelSink 
     { 
     get { return _nextSink; } 
     set { _nextSink = value; } 
     } 

     public void AsyncProcessResponse(
       IServerResponseChannelSinkStack sinkStack, 
       Object state, 
       IMessage message, 
       ITransportHeaders headers, 
       Stream stream) 
     { 
     IPAddress ip = headers[CommonTransportKeys.IPAddress] as IPAddress; 
     CallContext.SetData("ClientIPAddress", ip); 
     sinkStack.AsyncProcessResponse(message, headers, stream); 
     } 

     public Stream GetResponseStream(
       IServerResponseChannelSinkStack sinkStack, 
       Object state, 
       IMessage message, 
       ITransportHeaders headers) 
     { 
     return null; 
     } 

     public ServerProcessing ProcessMessage(
       IServerChannelSinkStack sinkStack, 
       IMessage requestMsg, 
       ITransportHeaders requestHeaders, 
       Stream requestStream, 
       out IMessage responseMsg, 
       out ITransportHeaders responseHeaders, 
       out Stream responseStream) 
     { 
     if (_nextSink != null) 
     { 
      IPAddress ip = 
        requestHeaders[CommonTransportKeys.IPAddress] as IPAddress; 

      CallContext.SetData("ClientIPAddress", ip); 
      ServerProcessing spres = _nextSink.ProcessMessage(
        sinkStack, 
        requestMsg, 
        requestHeaders, 
        requestStream, 
        out responseMsg, 
        out responseHeaders, 
        out responseStream); 
      return spres; 
     } 
     else 
     { 
      responseMsg = null; 
      responseHeaders = null; 
      responseStream = null; 
      return new ServerProcessing(); 
     } 
     } 
+0

शायद आपको अपना कोड जांचना होगा जहां आप लॉगिंग कर रहे हैं और यदि कोई त्रुटि है तो यह कनेक्शन से बाहर निकलें या पुनः प्रयास करें .. – MethodMan

+0

अच्छी तरह से मुझे पता है कि मुझे क्लाइंट पक्ष पर अपवाद पकड़ने की आवश्यकता है, लेकिन मैं रिमोट सेवा को क्रैश होने का कारण बनने का प्रयास करने का प्रयास कर रहा है। –

+0

क्या आपने यह सुनिश्चित करने के लिए कोड समीक्षा की है कि आप ऑब्जेक्ट्स को जारी कर रहे हैं ..? आमतौर पर सेवा अनुप्रयोगों को कोड करते समय बहुत से डेवलपर्स के साथ समस्या होती है .. क्या आप अपने कोड का एक स्निपेट पेस्ट कर सकते हैं ..? शायद आंखों की एक दूसरी जोड़ी में मदद मिलेगी – MethodMan

उत्तर

1

मुद्दा, मेरे कोड में की वजह से एक गतिरोध की वजह से था अगर स्मृति में कार्य करता है मैं दो ताला लगा वस्तुओं थी और मैं एक दूसरे के अंदर से एक बंद कर दिया, अनिवार्य रूप से उन्हें एक दूसरे के लिए इंतजार कर रही है। मैं दूरस्थ सेवा में एक डीबगर को जोड़कर इसे निर्धारित करने में सक्षम था।

4

यह पता लगाने के लिए क्यों कोई फोन उठाता है जब आप किसी मित्र को कॉल कोशिश की तरह है। और समस्या यह है कि उसका घर जमीन पर जला दिया गया। क्या हो रहा है इसका एक अपूर्ण दृश्य मुख्य मुद्दा है, विशेष रूप से सेवा के साथ बुरा है क्योंकि देखने के लिए बहुत कम है।

यह बेहतर जब तक आप उस टेलीफोन का उपयोग सेवा प्रोग्रामर करने के लिए बात करते हैं और उसे समस्या के साथ शामिल होने के लिए नहीं मिल सकता है। कोई इसे डीबग करना होगा। और हाँ, यह मुश्किल होगा, हर दो सप्ताह में एक बार असफल होने पर असफल नहीं माना जा सकता है। या ऐसा होने के लिए प्रतीक्षा करने के लिए बैठने के लिए बहुत लंबा है। केवल व्यावहारिक चीज जो आप मदद के लिए कर सकते हैं वह प्रक्रिया का एक मिनीडम्प बनाता है और सेवा प्रोग्रामर को पास करता है, इसलिए उसे कुछ करने के लिए कुछ मिल गया है। अगर सेवा किसी अन्य मशीन पर चलती है तो लैन व्यवस्थापक भी शामिल हो।

+0

मेरे पास एक मिनीडम्प है। इसके साथ मैं क्या करूं? मैं कैसे पता लगा सकता हूं कि रिमोटिंग ने क्यों रुकने का फैसला किया? – Mark

+0

@mark https://blogs.msdn.microsoft.com/kaevans/2011/04/11/intro-to-windbg-for-net-developers/ minidump का विश्लेषण करने के लिए विंडबग का उपयोग करने में आपकी सहायता करेगा, लेकिन यदि यह अनुमानित रूप से होता है आप सेवा के एक उदाहरण और/या सेवा में उचित लॉगिंग जोड़ने के लिए या तो (clr) डीबगर को जोड़ने से बेहतर हैं। – Yaur

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