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

You got a socket exception there - the stack trace you posted doesn't contain enough information as to why this happened.

Since the exception was not handled, the process terminated and of course the service stopped as result.

You need to find out why the exception occurred - add more logging and try to capture the incoming socket data.

于 2012-05-14T09:46:13.357 回答
2

一个未经处理的异常将使您的流程停止。

一个答案是处理异常,但是:

  • 仅仅处理异常并不能确保进程处于良好状态。
  • 有一小组StackOverflowException无法捕获的异常(例如 ):进程无法可靠地返回到已知状态。

或者:

  1. 配置服务(通过Services.msc)在出错时重新启动,
  2. 配置一个工具,如adplus(来自 Windows 调试工具)以在失败时进行进程转储。
  3. 使用这些进程转储来修复基础错误。
于 2012-05-14T09:47:18.403 回答
1

根据您提供的堆栈跟踪,由于垃圾收集在终结线程中引发了异常(请参阅堆栈跟踪中的“at Renci.SshNet.Sftp.SubsystemSession.Finalize”行)。

因为您无法捕获此异常,所以它会变得无人处理并停止您的进程。
这就是为什么“代码没有运行与 SFTP 服务器相关的”。

此外,如果您更仔细地查看堆栈跟踪,则会发现“在 Renci.SshNet.Channels.Channel.Dispose()”行。这条线意味着,第 3 方库开发人员试图在最终确定期间释放托管资源。在极少数情况下,这很有用。但是,与此同时,它非常危险且容易出错。

您应该联系库开发人员。
作为临时解决方法,您可以设置服务重启。

于 2012-05-14T10:00:15.380 回答
0

如果存在未处理的异常,Windows 服务将停止像任何其他应用程序一样工作,这就是您的情况。尝试调试代码(让服务作为控制台应用程序运行是我的策略,但您也可以使用附加到进程)来检查异常发生的原因,并正确处理它:服务应该以某种可靠的方式恢复,错误重启选项和朋友应该被用作极端的解决方案,例如,如果你不拥有代码。

于 2012-05-14T09:56:05.737 回答