【问题标题】:.NET remoting service seemingly crashes, and stops responding to clients.NET 远程服务似乎崩溃,并停止响应客户端
【发布时间】: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


【解决方案1】:

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

在您使用该电话与服务程序员交谈并让他参与解决问题之前,情况不会好转。 有人 将不得不对此进行调试。是的,这会很困难,每两周失败一次可能还不够关键。或者坐等它发生的时间太长。您可以做的唯一实际的事情是创建流程的小型转储并将其传递给服务程序员,以便他有一些东西可以戳。如果该服务在另一台机器上运行,那么也要让 LAN 管理员参与其中。

【讨论】:

  • 我有一个小型转储。我该怎么办?我如何找出远程处理决定停止收听的原因?
  • @mark blogs.msdn.microsoft.com/kaevans/2011/04/11/… 将帮助您使用 windbg 来分析 minidump,但如果这种情况可以预见地发生,您最好将 (clr) 调试器附加到服务实例和/或添加适当的登录到服务。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多