【发布时间】:2023-03-18 04:50:01
【问题描述】:
我有一个 .NET Remoting 服务,大部分时间都可以正常工作。如果发生异常或错误,它会将错误记录到文件中,但仍会继续运行。
但是,大约每两周一次,服务会停止响应客户端,这会导致客户端应用程序崩溃并出现 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();
}
}
【问题讨论】:
-
也许你需要检查你的代码在哪里进行日志记录,如果有错误让它退出或重试连接..
-
好吧,我知道我需要在客户端捕获异常,但我正试图找出导致远程服务崩溃的原因。
-
您是否进行了代码审查以确保您正在发布正在创建的对象..?这通常似乎是许多开发人员在编写服务应用程序时遇到的问题。你能粘贴你的代码的 sn-p 吗?也许第二双眼睛会有所帮助
-
这是很多代码,我完全不知道它会在哪里崩溃。以及如何/为什么要释放正在创建的对象?
-
ok 这里是你可以开始的地方.. 对单词 = New 进行全局搜索然后从那里是 Object Implements IDisposable,然后你可以执行以下操作 ((IDisposable).YouObject).Dispose ();如果它没有实现 IDisposable,则将 Null 分配给不再使用的对象.. 这有意义吗..?
标签: c# .net event-log .net-remoting