2012-08-12 74 views
3

我有一個永久運行的服務,無論客戶是否有權訪問此服務,但是在很長一段時間沒有客戶活動後,都能夠與客戶端連接。WCF和不活動超時:是否可以禁用不活動超時?

這是因爲,例如,假期後,我希望能夠連接服務,而無需手動重新啓動服務。

目前,如果我的服務在10分鐘內沒有收到任何連接,但我不想指定任何時間,我想要無限的時間。

謝謝。

回答

5

您可以設置inactivityTimeout="infinite",或者是一個非常高的值,雖然不推薦,但您的服務不應該這樣,一旦客戶端連接到它,他們可以「永遠」消費它。

UPDATE

我的錯誤,似乎inactivityTimeout不能設置爲無窮像其他超時如receiveTimeout

但是,爲什麼不只是設置receiveTimeout="infinite"inactivityTimeout僅在啓用reliableSession時使用,如果您不需要可靠的會話,則只需將綁定的receiveTimeout設置爲無限,在這種情況下,您的receiveTimeout就是您的不活動超時。如果您必須使用可靠的會話,那麼WCF將使用這兩個值來確定您的服務何時超時,並且兩者都需要滿足才能保持連接正常。看起來inactivityTimeout的最大值是'24 .20:31:23.6470000',基本上是24天和20.5小時,所以在最壞的情況下,只需設置你的inactivityTimeout="24.20:31:23",這個時間仍然相當長,差不多一個月。如果你在這段時間之間發送了一個簡單的保持活動的消息(基本上只是在你的服務上調用一些操作),你的連接將被維持。

+0

我不能使用無限值​​,它是無效的。 – 2012-08-13 10:24:39

+0

@Daimroc看到我的更新。 – 2012-08-13 12:35:06

+0

在應用程序中沒有'inactivityTimeout'作爲綁定屬性。config – KomalJariwala 2013-10-09 08:50:07

1

解決這個用:

  1. 方法從客戶機執行ping到服務器,以保持連接活躍每個30秒\
  2. 在服務器結合,ReceiveTimeout 1分鐘。
  3. 對於每個回調創建的ICommunicationObject,使用Closed事件刪除不活動的客戶端。
//Adding a client callback 
OperationContext context = OperationContext.Current; 
ICallback callback = context.GetCallbackChannel(); 
ICommunicationObject obj = (ICommunicationObject)callback; 
obj.Closed += new EventHandler(obj_Closed); 

//Event for inactive clients 
void obj_Closed(object sender, EventArgs e) 
     { 
      if (_callbacks.ContainsValue(((ITecnobelRemoteServiceCallback)sender))) 
      { 
       var item = _callbacks.First(kvp => kvp.Value == (ITecnobelRemoteServiceCallback)sender)); 
       _callbacks.Remove(item.Key); 
       treeViewClients.Nodes.RemoveByKey(item.Key.Id); 
       treeViewClients.Refresh(); 
       _registeredUsers--; 
       listBoxStatus.Items.Add(String.Format("Usuário {0} estava inativo e foi removido", item.Key.Id)); 
      } 
     }
0

我不知道有關.NET的其他版本,但在4.5我也試圖繞過靜止期的WCF服務。

一時興起,我設置了binding.ReceiveTimeout = System.Threading.Timeout.InfiniteTimeSpan,這是一個負時間跨度。這造成了一個例外,與消息的下面趣聞拋出:

System.ArgumentOutOfRangeException: Timeout must be greater than or equal to TimeSpan.Zero. To disable timeout, specify TimeSpan.MaxValue. 

於是我又回到了我的代碼,設置ReceiveTimeoutTimeSpan.MaxValue,現在不活動計時器被禁用。