2011-11-07 31 views
4

系統描述:我有一個客戶端(也是Windows服務)使用的WCF服務(自託管在Windows服務中)。這兩個應用程序設計爲具有恆定的正常運行時間。 '隊列'應用程序從數據庫中讀取條目,將'作業'發送到WCF服務進行處理,然後將某些信息返回給客戶端,然後客戶端將結果存儲回數據庫。WCF客戶端錯誤「可用的winsock資源不足」大約2小時後

錯誤詳細信息:大約兩個小時的客戶端應用程序後無法再連接到WCF服務報告錯誤:

「不足winsock的可用資源來完成套接字連接初始化。」

它運行在同一臺服務器上的第二個應用程序也開始從這個時候起拋出異常:

「,而與SQL Server建立連接時出現與網絡相關的或特定於實例的錯誤服務器(提供者:命名管道提供程序,錯誤:40 - 無法打開與SQL Server的連接)「

(錯誤:40 - 無法打開與SQL Server的連接)驗證實例名稱是否正確並且SQL Server已配置爲允許遠程連接。

第二個應用程序與WCF客戶端和服務器無關,它只是運行在山姆e服務器,並簡單地讀/寫數據庫。

服務器/客戶端安裝程序/代碼:

服務器詳細信息:

  • 自Windows服務中託管。
  • NetTcpBinding的
  • receiveTimeout = 「00:00:15」
  • serviceThrottling maxConcurrentCalls = 「2147483647」
  • maxConcurrentSessions = 「2147483647」

客戶端連接類::

public class ClientConnectionClass : ClientBase<IFileService>, IFileService, IDisposable 
{ 

    public void callMethod(InputRequest request) 
    { 
     result = base.Channel.doRequest(request); 
    } 

    void Dispose() 
    { 
     bool success = false; 
     try 
     { 
      if (State != CommunicationState.Faulted) 
      { 
       Close(); 
       success = true; 
      } 
     } 
     finally 
     { 
      if (!success) 
      { 
       Abort(); 
      } 
     } 
    } 
} 

客戶端進程(Windows服務):

while(true) 
{ 
    // Do some stuff before, code ommited 
    ClientConnectionClass ccc = new ClientConnectionClass(); 
    ccc.callMethod(inputRequest); 
    // Do some stuff with the response 
    // Close the connection class, is this the right way to close it? 
    ccc.Close(); 
    Thread.Sleep(1000); 
} 

可能的解釋: 我認爲,基於第一異常錯誤,代碼不打烊/釋放套接字連接或用完的端口上連接(請注意,我明確地調用Close ()方法,除了在ClientBase上實現Dispose()方法外)。

說明:客戶端應用程序是多線程的,最多有4個併發線程同時運行,每個線程都調用WCF服務。客戶端到WCF服務正在全面開展工作,直到客戶端進程吐出錯誤的2小時(ish)點和其他(無關的)Windows服務(使用網絡資源)也開始吐出錯誤。

可能的問題回答:我是創建/處置實現ClientBase類的類嗎?有沒有更簡單的方法來調試/記錄客戶端或WCF服務的當前狀態(我已經連接了perfmon.exe,但它並沒有真正提供有關套接字/網絡方面的有用信息)。

感謝

更新:我其實現在包裹ClientConnectionClass成「使用」聲明,我目前正在測試的(這通常需要2小時)。 更新,這沒有奏效。

+0

我的預感會在你的線上。嘗試只運行一個線程,看看會發生什麼 –

回答

0

你在運行什麼平臺? Win2k3,Win2k8?我在Win2k8上運行的Win2k8系統上運行的「解析」系統上遇到類似問題的應用程序的Web上看到了未經證實的報告。另外,如果客戶端和服務器在同一個系統上運行,是否可以使用namedpipe綁定與nettcp?不是一個真正的修復,但可以解決您的特定問題。

+0

我在Win Server 2k8 R2上運行這個。我已經將它轉換爲使用namedpipe綁定而不是nettcp,它工作正常。不知道原因是什麼。部分解決方案。 – user989056

4

我遇到了使用Windows Server 2008 R2 SP1的非常類似的情況。經過一段時間的排查和研究。找到一個聽起來完全像它的支持文章。

這可能是你的修復,以及:

http://support.microsoft.com/kb/2577795

有它修補程序。

症狀在文章中描述:

「請考慮以下情形: 您有運行Windows Server 2008 R2或Windows 7 的多處理器計算機在運行計算機上創建環回套接字的應用。 在這種情況下,應用程序可能無法創建新套接字,並且計算機上出現「無緩衝區空間可用」異常。此外,出現此問題時,用戶無法遠程連接到計算機,直到它重新啓動。 。

「出現此問題的原因在的WinSock(Afd.sys中)的輔助功能驅動程序中的競爭條件,導致插座被泄露隨着時間的推移,這是問題:在文章中描述

原因如果所有可用的套接字資源都用盡,則會出現「症狀」一節中所述的問題。「

更新:我已通過升級一個服務器進行了驗證,而不是另一個修復程序確實爲我解決了問題。將它們並排運行,沒有修補程序的服務器遇到WinSock問題,而帶有此修補程序的服務器仍將其源端口重新設置在49-50k範圍內。