2012-12-13 23 views
10

Mam usługę .NET Remoting, która działa dobrze przez większość czasu. Jeśli wystąpi wyjątek lub błąd, rejestruje błąd w pliku, ale nadal działa.. Usługa zdalna usługi .NET pozornie ulega awarii i przestaje odpowiadać na klientów.

Jednak około raz na dwa tygodnie usługa przestaje reagować na klientów, co powoduje appication klienta do zderzenia z SocketException z następującym komunikatem:

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 

Nie ma wyjątków lub stos śledzenia są zapisywane do naszego dziennika plik, więc nie mogę ustalić, w którym miejscu następuje awaria usługi, co prowadzi mnie do przekonania, że ​​znajduje się gdzieś poza moim błędem. Jakie dodatkowe kroki mogę podjąć, aby ustalić przyczynę tej awarii? Wyobrażam sobie, że coś pisze do EventLog gdzieś, ale nie jestem zaznajomiony z systemem rejestrowania zdarzeń Windows, więc nie jestem do końca pewien, gdzie szukać.

Z góry dziękujemy za pomoc w tej sprawie.

EDYCJA: Zapomniałem wspomnieć, zatrzymanie lub ponowne uruchomienie usługi nic nie robi, usługa nigdy nie odpowiada. Muszę ręcznie zabić proces, zanim będę mógł ponownie uruchomić usługę.

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

Być może musisz sprawdzić kod, w którym robisz rejestrowanie i jeśli wystąpił błąd, czy chcesz zakończyć lub ponownie połączyć się z serwerem .. – MethodMan

+0

Wiem, że muszę złapać wyjątek po stronie klienta, ale jestem próbuje dowiedzieć się, co powoduje awarię usługi zdalnej. –

+0

Czy dokonałeś przeglądu kodu, aby upewnić się, że zwalniasz Obiekty, które są tworzone ..? co zwykle wydaje się być problemem dla wielu programistów podczas kodowania aplikacji Service .. czy możesz wkleić fragment kodu? być może druga para oczu pomogłaby – MethodMan

Odpowiedz

1

Problem był spowodowany zakleszczeniem spowodowanym w moim kodzie, jeśli pamięć służy, miałem dwa obiekty blokujące i zablokowałem jeden z drugiego, zasadniczo sprawiając, że czekają na siebie nawzajem. Udało mi się to ustalić poprzez podłączenie debuggera do usługi zdalnej.

4

To jak próbuje dowiedzieć się, dlaczego nikt nie odbiera telefonu, gdy dzwonisz do przyjaciela. Problem w tym, że jego dom spłonął na ziemię. Niedoskonały obraz tego, co się dzieje, jest głównym problemem, szczególnie złym w przypadku usługi, ponieważ jest tak mało do obejrzenia.

To nie może się poprawić, dopóki nie użyjesz tego telefonu do rozmowy z programistą usług i nie zmotywujesz go do tego problemu. Ktoś będzie musiał to debugować. I tak, będzie to trudne, a niepowodzenie raz na dwa tygodnie może nie zostać uznane za wystarczająco krytyczne. Lub zbyt długo, aby siedzieć i czekać, aż to się stanie. Jedyną praktyczną rzeczą, którą możesz zrobić, aby pomóc, jest stworzenie minidumpu procesu i przekazanie go programistom usług, więc ma coś do roboty. Jeśli usługa działa na innej maszynie, należy również zwrócić się do administratora sieci LAN.

+0

Mam minidump. Co mam z tym zrobić? Jak mogę się dowiedzieć, dlaczego remoting postanowił przestać słuchać? – Mark

+0

@mark https://blogs.msdn.microsoft.com/kaevans/2011/04/11/intro-to-windbg-for-net-developers/ pomoże ci użyć windbg do analizy minizrzutu, ale jeśli tak się stanie lepszym rozwiązaniem jest dołączenie (clr) debuggera do instancji usługi i/lub dodanie odpowiedniego logowania do usługi. – Yaur