10

ほとんどの場合正常に動作する.NETRemotingサービスがあります。例外またはエラーが発生した場合、エラーはファイルに記録されますが、実行は継続されます。

ただし、約2週間に1回、サービスがクライアントへの応答を停止します。これにより、クライアントアプリケーションが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();
         }
      }
4

2 に答える 2

1

この問題は、コードでデッドロックが発生したことが原因でした。メモリが機能する場合、2 つのロック オブジェクトがあり、一方を他方の内側からロックし、基本的にそれらを互いに待機させます。これは、デバッガーをリモート サービスに接続することで特定できました。

于 2016-02-03T17:39:06.170 に答える