窗口服务因错误而自动停止?

时间:2012-05-14 09:42:05

标签: c# .net windows-services

我有一个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 个答案:

答案 0 :(得分:3)

你有一个套接字异常 - 你发布的堆栈跟踪没有包含足够的信息,说明为什么会这样。

由于未处理异常,流程终止,当然服务因此而停止。

您需要找出发生异常的原因 - 添加更多日志记录并尝试捕获传入的套接字数据。

答案 1 :(得分:2)

无法处理的异常会降低您的流程。

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

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

可替换地:

  1. 配置服务(通过Services.msc)以在错误时重新启动,
  2. 配置adplus之类的工具(来自Windows调试工具),以便在失败时进行进程转储。
  3. 使用这些进程转储来修复底层错误。

答案 2 :(得分:1)

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

因为你无法捕捉到这个例外,所以它变得毫无瑕疵并停止了你的过程 这就是为什么“代码没有运行与SFTP服务器相关”。

另外,如果你更仔细地看一下堆栈跟踪,那就是“在Renci.SshNet.Channels.Channel.Dispose()”行。此行表示第三方库开发人员尝试在最终确定期间发布托管资源。当这很有用时,很少有案例。但是,与此同时,它非常危险且容易出错。

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

答案 3 :(得分:0)

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