我有一个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>
答案 0 :(得分:3)
你有一个套接字异常 - 你发布的堆栈跟踪没有包含足够的信息,说明为什么会这样。
由于未处理异常,流程终止,当然服务因此而停止。
您需要找出发生异常的原因 - 添加更多日志记录并尝试捕获传入的套接字数据。
答案 1 :(得分:2)
无法处理的异常会降低您的流程。
一个答案是处理异常,但是:
StackOverflowException
)无法捕获:进程无法可靠地返回已知状态。可替换地:
Services.msc
)以在错误时重新启动,adplus
之类的工具(来自Windows调试工具),以便在失败时进行进程转储。答案 2 :(得分:1)
根据您提供的堆栈跟踪,由于垃圾回收而在终结线程中引发异常(请参阅堆栈跟踪中的“Renci.SshNet.Sftp.SubsystemSession.Finalize”行)。
因为你无法捕捉到这个例外,所以它变得毫无瑕疵并停止了你的过程 这就是为什么“代码没有运行与SFTP服务器相关”。
另外,如果你更仔细地看一下堆栈跟踪,那就是“在Renci.SshNet.Channels.Channel.Dispose()”行。此行表示第三方库开发人员尝试在最终确定期间发布托管资源。当这很有用时,很少有案例。但是,与此同时,它非常危险且容易出错。
您应该联系图书馆开发人员 作为临时解决方法,您可以设置服务重新启动。
答案 3 :(得分:0)
如果存在未处理的异常,Windows服务将停止作为任何其他应用工作,这是您的情况。尝试调试代码(让服务作为控制台应用程序运行是我的策略,但你也可以使用attach来处理)检查为什么异常发生,并正确处理它:服务应该以一种可靠的方式恢复,重启错误选项和朋友应该用作极端解决方案,例如,如果你不拥有代码。