1

私は24*7を実行するWindowsサービスを持っています。このサービスは、Renci.SshNet(サードパーティのdll)を使用してsftpサーバーに接続し、ファイルをダウンロードおよびアップロードします。

イベントビューアで以下の情報を取得しました。ログファイルを確認したところ、このエラーが発生したときに、SFTPサーバーに関連するコードが実行されていなかったことがわかりました。

try catchブロックにすべてのコードを記述したので、すべてのエラーがログファイルに記録されます。

このエラーが原因で、Windowsサービスが停止しました。

この問題の根本的な原因と、サービスが自動的に停止しないようにコードを変更する方法を知りたいです。

Log Name:      Application
Source:        .NET Runtime
Date:          5/12/2012 10:49:12 AM
Event ID:      1026
Task Category: None
Level:         Error
Keywords:      Classic
User:          N/A
Computer:      FedEx-EDI-01
Description:
Application: Ess.SupplyChainService.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.Net.Sockets.SocketException
Stack:
   at Renci.SshNet.Session.WaitHandle(System.Threading.WaitHandle)
   at Renci.SshNet.Channels.Channel.Dispose(Boolean)
   at Renci.SshNet.Channels.ChannelSession.Dispose(Boolean)
   at Renci.SshNet.Channels.Channel.Dispose()
   at Renci.SshNet.Sftp.SubsystemSession.Dispose(Boolean)
   at Renci.SshNet.Sftp.SftpSession.Dispose(Boolean)
   at Renci.SshNet.Sftp.SubsystemSession.Finalize()

Event Xml:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
    <Provider Name=".NET Runtime" />
    <EventID Qualifiers="0">1026</EventID>
    <Level>2</Level>
    <Task>0</Task>
    <Keywords>0x80000000000000</Keywords>
    <TimeCreated SystemTime="2012-05-12T14:49:12.000Z" />
    <EventRecordID>3723</EventRecordID>
    <Channel>Application</Channel>
    <Computer>FedEx-EDI-01</Computer>
    <Security />
  </System>
  <EventData>
    <Data>Application: Ess.SupplyChainService.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.Net.Sockets.SocketException
Stack:
   at Renci.SshNet.Session.WaitHandle(System.Threading.WaitHandle)
   at Renci.SshNet.Channels.Channel.Dispose(Boolean)
   at Renci.SshNet.Channels.ChannelSession.Dispose(Boolean)
   at Renci.SshNet.Channels.Channel.Dispose()
   at Renci.SshNet.Sftp.SubsystemSession.Dispose(Boolean)
   at Renci.SshNet.Sftp.SftpSession.Dispose(Boolean)
   at Renci.SshNet.Sftp.SubsystemSession.Finalize()
</Data>
  </EventData>
</Event>
4

4 に答える 4

3

そこでソケット例外が発生しました。投稿したスタックトレースには、これが発生した理由に関する十分な情報が含まれていません。

例外が処理されなかったため、プロセスは終了し、もちろんサービスは停止しました。

例外が発生した理由を確認する必要があります。ログを追加して、着信ソケットデータをキャプチャしてみてください。

于 2012-05-14T09:46:13.357 に答える
2

手に負えない例外はあなたのプロセスをダウンさせます。

1つの答えは、例外を処理することですが、次のとおりです。

  • 例外を処理するだけでは、プロセスが良好な状態であるとは限りません。
  • StackOverflowExceptionキャッチできない例外の小さなセット(例)があります。プロセスが既知の状態に確実に戻る方法はありません。

または:

  1. Services.mscエラー時に再起動するように(を介して)サービスを構成します。
  2. (Windows用のデバッグツールから)のようなツールを構成してadplus、失敗時にプロセスダンプを取得します。
  3. これらのプロセスダンプを使用して、根本的なエラーを修正します。
于 2012-05-14T09:47:18.403 に答える
1

提供したスタックトレースによると、ガベージコレクションが原因でファイナライズスレッドで例外が発生しました(スタックトレースの「atRenci.SshNet.Sftp.SubsystemSession.Finalize」行を参照)。

この例外をキャッチできないため、手に負えなくなり、プロセスが停止します。
そのため、「SFTPサーバーに関連してコードが実行されていませんでした」。

また、スタックトレースをより注意深く見ると、「at Renci.SshNet.Channels.Channel.Dispose()」という行があります。この行は、サードパーティのライブラリ開発者がファイナライズ中に管理対象リソースを解放しようとしていることを意味します。これが役立つ場合はほとんどありません。しかし同時に、それは非常に危険でエラーが発生しやすいものです。

ライブラリ開発者に連絡する必要があります。
一時的な回避策として、サービスの再起動を設定できます。

于 2012-05-14T10:00:15.380 に答える
0

未処理の例外がある場合、Windowsサービスは他のアプリと同様に機能しなくなります。コードをデバッグしてみて(サービスをコンソールアプリケーションとして実行するのが私の戦略ですが、attachを使用して処理することもできます) 、例外が発生する理由を確認し、適切に処理します。サービスは信頼できる方法で回復する必要があります。エラー時に再起動するオプションを使用すると、たとえばコードを所有していない場合など、極端な解決策として友人を使用する必要があります。

于 2012-05-14T09:56:05.737 に答える