2012-12-13 26 views
10

Çoğu zaman iyi çalışan bir .NET Remoting hizmeti var. Bir istisna veya hata olursa, hatayı bir dosyaya kaydeder, ancak yine de çalışmaya devam eder..NET uzaktan görüntüleme hizmeti çöküyor ve istemcilere yanıt vermiyor.

Ancak yaklaşık bir kere aşağıdaki iletiyi içeren bir SocketException ile çökmesine istemci appication neden hizmet müşterilerine yanıt vermiyor iki haftada:

İstisna yok ya yığın izleme bizim günlüğüne
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 

yazılır Bu yüzden hizmetin nerede kilitlendiğini anlayamıyorum, bu da benim kodumun dışında bir yerde başarısız olduğuna inanmamı sağlıyor. Bu çökmenin temel nedenini anlamak için hangi ek adımları atabilirim? Bir yerdeki EventLog'a bir şeyler yazdığını düşünürdüm ama Windows 'Event Logging sistemine aşina değilim, bu yüzden nereye bakacağından tam olarak emin değilim.

Bu konuyla ilgili herhangi bir yardım için şimdiden teşekkür ederiz.

DÜZENLEME: Hizmetin durdurulması veya yeniden başlatılmasının hiçbir şey yapmaması, hizmetin hiçbir zaman yanıt vermediğinden bahsetmeyi unutmayınız. Servisi tekrar başlatabilmem için işlemi el ile öldürmem gerekiyor.

DÜZENLEME 2: Bu, bir dostu aramak zaman kimse telefonunu eline nedenini öğrenmek için çalışmak gibidir

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

Belki de kodunuzu günlüğe kaydetme işleminizi yapıyorsanız ve bir hata varsa, çıkın ya da bağlantıyı yeniden deneyin. – MethodMan

+0

İstemci tarafında özel durumu yakalamam gerektiğini biliyorum. uzaktan hizmetin neden çökmesine sebep olduğunu anlamaya çalışmak. –

+0

Oluşturulmakta olan Nesneleri yayınladığınızdan emin olmak için bir kod incelemesi yaptınız ..? Bu genellikle Servis uygulamalarını kodlarken birçok geliştiricinin problemi gibi görünüyor. Kodunuzun bir parçasını yapıştırabiliyorsunuz ..? belki de ikinci bir çift göz yardımcı olur – MethodMan

cevap

1

Sorun, kodumda neden olunan bir kilitlenme nedeniyle oldu, bellek sunulduğunda iki kilitleme nesnesine sahiptim ve birini diğerinin içine kilitledim, temel olarak birbirlerini bekletiyordum. Uzaktan servise bir hata ayıklayıcısını bağlayarak bunu belirleyebiliyordum.

4

. Sorun şu ki, evi evine kadar yandı. Neler olup bittiğine dair kusurlu bir bakış, asıl meseledir, özellikle bir hizmetle kötüdür, çünkü bakılması gereken çok az şey vardır.

Bu program, servis programlayıcıyla konuşmak ve sorunla ilgilenmesini sağlamak için bu telefonu kullanana kadar daha iyi olamaz. Biri, bunun hatalarını ayıklamak zorunda kalacak. Ve evet, zor olacak, iki haftada bir kez başarısız oluncaya kadar yeterince eleştirilmiyor olabilir. Ya da beklemek için beklemek için çok uzun. Yardım etmek için yapabileceğiniz tek pratik şey, sürecin bir minidump'unu yaratmak ve bunu servis programcısına aktarmaktır, böylece bir şeyleri halletmek için. Hizmet başka bir makinede çalışıyorsa, LAN yöneticisini de dahil edin.

+0

Bir minidump var. Bununla ne yapacağım? Uzaktan kumandanın neden dinlemeyi bıraktığına nasıl karar verebilirim? – Mark

+0

@mark https://blogs.msdn.microsoft.com/kaevans/2011/04/11/intro-to-windbg-for-net-developers/ minidump analiz etmek için windbg kullanmanıza yardımcı olacaktır, ancak bu tahmin edilirse Hizmetin bir örneğine bir (clr) hata ayıklayıcısını ekleyerek ve/veya hizmete düzgün bir şekilde günlüğe kaydetmeyi eklemekten daha iyidir. – Yaur