2012-12-13 15 views
10

Ich habe einen .NET Remoting-Dienst, der die meiste Zeit funktioniert. Wenn eine Ausnahme oder ein Fehler auftritt, protokolliert sie den Fehler in einer Datei, wird jedoch weiterhin ausgeführt..NET Remoting-Dienst scheint abstürzt und reagiert nicht mehr auf Clients

jedoch etwa einmal alle zwei Wochen die Dienstleistungen für die Kunden nicht mehr reagiert, die den Client appication verursacht mit einer Socket mit der folgenden Meldung zum Absturz:

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 

Keine Ausnahme oder Stack-Trace wird in unserem Protokoll geschrieben Datei, so kann ich nicht herausfinden, wo der Dienst abstürzt, was mich zu der Annahme verleitet, dass es irgendwo außerhalb meines Codes fehlschlägt. Welche zusätzlichen Schritte kann ich unternehmen, um die Ursache für diesen Absturz herauszufinden? Ich könnte mir vorstellen, dass irgendwo etwas in ein EventLog geschrieben wird, aber ich kenne das Windows-Ereignisprotokollierungssystem nicht sehr gut, so dass ich nicht genau weiß, wo ich es suchen soll.

Vielen Dank im Voraus für jede Hilfe mit diesem.

EDIT: Vergessen zu erwähnen, stoppen oder neu starten der Dienst tut nichts, der Dienst reagiert nie. Ich muss den Prozess manuell beenden, bevor ich den Dienst erneut starten kann.

EDIT 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

Vielleicht müssen Sie Ihren Code überprüfen, wo Sie die Protokollierung tun, und wenn es einen Fehler gibt, beenden oder die Verbindung erneut versuchen .. – MethodMan

+0

Nun, ich weiß, ich muss die Ausnahme auf der Client-Seite zu fangen, aber ich bin versuchen herauszufinden, was den Remote-Dienst zum Absturz bringt. –

+0

Haben Sie eine Codeüberprüfung durchgeführt, um sicherzustellen, dass Sie Objekte freigeben, die gerade erstellt werden? das scheint normalerweise das Problem mit vielen Entwicklern beim Programmieren von Dienstprogrammen zu sein. Kannst du einen Ausschnitt aus deinem Code einfügen? vielleicht würde ein zweites Paar Augen helfen – MethodMan

Antwort

1

Das Problem war aufgrund eines Deadlocks in meinem Code verursacht, wenn Speicher dient, hatte ich zwei Sperrobjekte und ich schloss eins aus dem anderen, im Wesentlichen lassen sie aufeinander warten. Ich konnte dies feststellen, indem ich einen Debugger an den Remote-Dienst anschloss.

4

Dies ist wie der Versuch, herauszufinden, warum niemand nimmt das Telefon, wenn Sie einen Freund anrufen. Und das Problem ist, dass sein Haus niedergebrannt ist. Ein unvollkommener Blick auf das, was vor sich geht, ist das Kernproblem, besonders schlecht bei einem Service, weil es so wenig zu sehen gibt.

Dies kann nicht besser werden, bis Sie dieses Telefon verwenden, um mit dem Dienstprogrammierer zu sprechen und ihn in das Problem einzubeziehen. Jemand wird dies debuggen müssen. Und ja, es wird schwierig sein, ein Versagen alle zwei Wochen nicht als kritisch genug zu betrachten. Oder zu lange, um herumzusitzen und darauf zu warten, dass es passiert. Die einzige praktische Hilfe, die Sie tun können, ist, einen Minidump des Prozesses zu erstellen und ihn an den Service-Programmierer zu übergeben, damit er etwas anpacken kann. Wenn der Dienst auf einem anderen Computer ausgeführt wird, müssen Sie auch den LAN-Administrator hinzuziehen.

+0

Ich habe einen Minidump. Was mache ich damit? Wie kann ich herausfinden, warum das Remoting aufhört zu hören? – Mark

+0

@mark https://blogs.msdn.microsoft.com/kaevans/2011/04/11/intro-to-windbg-for-net-developers/ wird Ihnen helfen, windbg zu verwenden, um den Minidump zu analysieren, aber wenn dies vorhersehbar geschieht Es ist besser, entweder einen (clr) -Debugger an eine Instanz des Dienstes anzuhängen und/oder dem Dienst eine ordnungsgemäße Protokollierung hinzuzufügen. – Yaur