2013-07-31 80 views
0

我已經配置我的WCF這些超時較大:WCF超時比配置

public static NetTcpBinding MakeTcpBinding(bool isClient) 
    { 
    return new NetTcpBinding(SecurityMode.None, false) 
    { 
     HostNameComparisonMode = HostNameComparisonMode.StrongWildcard, 
     TransactionFlow = false, 
     PortSharingEnabled = true, 
     Security = {Transport = {ClientCredentialType = TcpClientCredentialType.None}}, 
     ReceiveTimeout = isClient ? TimeSpan.FromSeconds(5) : TimeSpan.FromDays(1), 
     SendTimeout = isClient ? TimeSpan.FromSeconds(1) : TimeSpan.FromSeconds(5), 
     OpenTimeout = TimeSpan.FromSeconds(1), 
     CloseTimeout = TimeSpan.FromSeconds(5), 
     MaxReceivedMessageSize = int.MaxValue, 
     ListenBacklog = int.MaxValue, 
     MaxBufferSize = int.MaxValue, 
     MaxBufferPoolSize = 524288, 
     ReaderQuotas = 
     { 
      MaxArrayLength = int.MaxValue, 
      MaxStringContentLength = int.MaxValue, 
      MaxDepth = int.MaxValue, 
      MaxBytesPerRead = int.MaxValue, 
      MaxNameTableCharCount = int.MaxValue 
     } 
    }; 
    } 

當客戶端連接到一個不存在的服務器,應該設置imeout爲1秒。

但是,實際上打開時,我看到21秒的超時。

DEBUG 2013年7月31日18:12:44712​​ Communication.WcfCommunicator - NotifyAllReceivers:類型:AskWhoIsAwake,SentDate:2013年7月31日18時12分44秒 AM,DetectSessionId:37106dee-b563-458b -9eb7-a90e81f82563 - 1個

DEBUG 2013年7月31日18:13:05746 Communication.WcfCommunicator - 無法連接到 的net.tcp://notup/xxx.svc/motup_www-xxx-com。連接嘗試 持續時間跨度爲00:00:00.9879988。 TCP錯誤代碼10060:A 連接嘗試失敗,因爲連接方在一段時間後沒有正確響應 響應,或者建立的連接失敗 因爲連接的主機未能響應42.42.42.42:808。 - 6

什麼導致額外的20秒超時?

+0

你如何計算21秒超時?我看到'連接嘗試持續時間跨度爲00:00:00.9879988',因此傳輸在987 ms(非常接近1秒)之後引發了連接異常,這與您所期望的有所不同 –

+0

時間戳顯示21秒的差異儘管 – Cine

+0

可能重複[WCF客戶端忽略超時值時服務](http://stackoverflow.com/questions/11902985/wcf-client-ignores-timeout-values-when-service-down) – Cine

回答

1

使用異步打開和設置超時解決。

 var ar = client.InnerChannel.BeginOpen(null, null); 
    if (!ar.AsyncWaitHandle.WaitOne(client.Endpoint.Binding.OpenTimeout, true)) 
     throw new CommunicationException("Service is not available"); 
    client.InnerChannel.EndOpen(ar);