NET远程处理服务似乎崩溃了,并停止了对客户端的响应



我有一个。NET远程处理服务,该服务在大多数情况下都运行良好。如果发生异常或错误,它会将错误记录到文件中,但仍会继续运行。

然而,大约每两周服务就会停止对客户端的响应一次,这会导致客户端应用程序崩溃,并显示SocketException,消息如下:

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

我们的日志文件中没有写入异常或堆栈跟踪,所以我无法确定服务崩溃的位置,这让我相信它是在我的代码之外的某个地方失败的。我还可以采取哪些步骤来找出此次崩溃的根本原因?我想它会在某个地方向EventLog写入一些内容,但我对Windows的事件日志系统不是很熟悉,所以我不确定该去哪里看。

提前感谢您对此提供的任何帮助。

编辑:别提了,停止或重新启动服务什么都不做,服务永远不会响应。我需要手动终止进程,然后才能再次启动服务。

编辑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();
}
}

这就像试图找出为什么当你给朋友打电话时没有人接电话一样。问题是他的房子被烧毁了。对正在发生的事情的不完美的看法是核心问题,尤其是对服务来说,因为几乎没有什么可看的

除非你用电话与服务程序员交谈,让他参与到问题中来,否则情况不会好转有人将不得不调试这个。是的,这将是困难的,每两周失败一次可能还不够关键。或者坐在那里等它发生的时间太长了。你能做的唯一实用的事情就是创建一个进程的小型转储,并将其传递给服务程序员,这样他就有东西可以戳了。如果服务在另一台机器上运行,那么也让LAN管理员参与进来。

这个问题是由于我的代码中导致的死锁,如果内存服务,我有两个锁定对象,并且我从另一个内部锁定了一个,本质上是让它们相互等待。我能够通过将调试器连接到远程服务来确定这一点。

相关内容

  • 没有找到相关文章

最新更新