2012-05-14 70 views
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> 
+0

我們需要看代碼來幫助你 – Baz1nga

+0

有很多組件依次運行,所以不可能發佈代碼。 –

+0

我沒有做任何套接字編程,第三方DLL可能使用套接字來連接SFTP。 –

回答

2

一個非常規的異常會降低您的過程。

答案之一是處理異常,但:

  • 只是處理異常並不能保證這個過程是在一個良好的狀態。
  • 有一小部分例外(例如StackOverflowException)無法捕獲:進程無法可靠地返回到已知狀態。

或者:

  1. 配置服務(通過),以重新啓動的錯誤,
  2. 配置像adplus工具(從Windows調試工具),以承擔失敗的進程轉儲。
  3. 使用這些進程轉儲來修復潛在的錯誤。
3

你在那裏得到一個套接字異常 - 你發佈的堆棧跟蹤沒有包含足夠的信息,爲什麼發生這種情況。

由於未處理異常,因此進程已終止,當然服務因此而停止。

您需要找出發生異常的原因 - 添加更多日誌記錄並嘗試捕獲傳入的套接字數據。

0

如果存在未處理的異常,那麼Windows服務會停止工作,如其他應用程序。嘗試調試代碼(將服務作爲控制檯應用程序運行是我的策略,但您也可以使用附加過程)來檢查爲什麼發生異常並正確處理:服務應以某種可靠的方式恢復,錯誤重啓選項和朋友應該被用來作爲極端的解決方案,例如,如果你不擁有代碼。

1

根據您提供的堆棧跟蹤,由於垃圾收集(請參閱「在堆棧跟蹤中的Renci.SshNet.Sftp.SubsystemSession.Finalize」行),在定型線程中引發異常。

因爲你無法捕捉到這個異常,所以它變得無人看管並停止了你的過程。
這就是爲什麼「代碼沒有運行與SFTP服務器相關」。另外,如果您更仔細地查看堆棧跟蹤,則可以在「Renci.SshNet.Channels.Channel.Dispose()」行中找到。此行意味着,第三方庫開發人員在完成期間試圖釋放託管的資源。有很少的情況下,這是有用的。但是,在同一時間,這是非常危險和容易出錯的。

您應該聯繫圖書館開發人員。
作爲臨時解決方法,您可以設置服務重啓。