系統描述:我有一個客戶端(也是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小時)。 更新,這沒有奏效。
我的預感會在你的線上。嘗試只運行一個線程,看看會發生什麼 –