2009-11-10 98 views
0

我有一段代碼調用託管在服務器上的WCF服務。WCF:超時錯誤

該代碼不斷循環四處調用此方法。 (這是要求'地位',所以它根本沒有做任何工作)。

這很好,只是經過一段時間後出現錯誤:
發送到net.tcp:// serverName:9001/service1的此請求操作未在配置的超時(00:00)內收到回覆:09.9843754)

突然我無法到達服務器。我增加了超時到1分鐘,但仍然是同樣的問題。請注意,承載該服務的程序無所作爲,只是提供了「狀態」。所以這不是WCF服務應用程序忙碌的問題。

我認爲這是一個代碼調用服務的問題,因爲當我重新啓動應用程序時,它可以連接到服務就好了...直到在另一短時間後,我再次得到超時錯誤。由於這個原因,我不認爲這是一個網絡錯誤,因爲當我重新啓動應用程序可以一段時間。

這裏是我用來調用服務的代碼。我需要在每次通話後處理ChannelFactory以清理它或我在做什麼?

 NetTcpBinding binding = new NetTcpBinding(SecurityMode.Message); 
       binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows; 

       EndpointAddress endPoint = new EndpointAddress(new Uri(clientPath)); 

       ChannelFactory<IClient> channel = new ChannelFactory<IClient>(binding, endPoint); 
       channel.Faulted += new EventHandler(channel_Faulted); 
       IClient client = channel.CreateChannel(); 

       ((IContextChannel)client).OperationTimeout = new TimeSpan(0, 0, 10); 
       ClientStatus clientStatus = client.GetStatus(); 

回答

0

完成調用GetStatus後,您必須關閉客戶端連接。最好的辦法是使用一個使用塊。但你也可以做這樣的事情您的通話client.GetStatus()

ClientStatus clientStatus = client.GetStatus(); 

try 
{ 
    if (client.State != System.ServiceModel.CommunicationState.Faulted) 
    { 
     client.Close(); 
    } 
} 
catch (Exception ex) 
{ 
    client.Abort(); 
} 
+0

如果該國出現故障這不是因爲工作,neighter關閉(),也沒有關於()將會被調用後。您應該在try塊內移動client.GetState(),或者在調用Close()之前移除該編碼。 – 2013-05-26 08:17:07