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();
}
}
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
Wiem, że muszę złapać wyjątek po stronie klienta, ale jestem próbuje dowiedzieć się, co powoduje awarię usługi zdalnej. –
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