2011-06-16 64 views
8

使用微軟的EWS,我們能夠收聽郵箱並在新電子郵件進入時採取行動。但是,我無法弄清楚如何避免連接超時。增加EWS流訂閱連接的生命週期元素

每微軟,這裏是一個StreamingSubscriptionConnection構造:

public StreamingSubscriptionConnection (
    ExchangeService service, 
    int lifetime 
) 

在我的應用程序,如下我編寫它:

service = new ExchangeService(ExchangeVersion.Exchange2010_SP1); 
StreamingSubscriptionConnection conn = new StreamingSubscriptionConnection(service, 30); 

換句話說,我已經得到了超時(終身)設置爲30分鐘,因爲這是我能夠設置的最高值。我怎樣才能增加這個?或者,即使在收到的電子郵件之間發生約45分鐘的轉發,我如何欺騙此訂閱仍然存活?

回答

14

30分鐘是一個硬限制。您無法將其更改爲更高的值。

要解決此問題,請將處理程序連接到連接實例的OnDisconnect事件的OnDisconnected處理程序。從那裏重新啓動訂閱(只需從該處理程序調用connection.Open())。

+0

但是什麼時候它是一個合法的斷開?例如,有人停止服務......我需要區分這兩種情況。 – WEFX 2011-06-27 13:24:18

+0

啊,我現在看到了。 「停止」被認爲不同於斷開。我要買它。謝謝 – WEFX 2011-06-27 14:26:53

+0

讓我測試一下,賞金將是你的,@亨寧克勞斯。 – WEFX 2011-06-27 14:27:43

1

如果有人對此感興趣,下面是添加的一點邏輯。

我將此添加到我的啓動方式:

conn.OnDisconnect += 
    new StreamingSubscriptionConnection.SubscriptionErrorDelegate(OnDisconnect); 

我接着又說了OnDisconnect方法:

private void OnDisconnect(object sender, SubscriptionErrorEventArgs args) 
{ 
    Start(); 
} 

歸根結底,這仍然需要改進,因爲這只是將超時並在重新連接每隔半小時,而不管收到的電子郵件活動。我寧願在每次收到新消息時重置計數器。然後,它只會每天超時幾次,而不是48次!不過,這仍然是爲了讓我的電子郵件收聽程序保持在線狀態。

+0

您的OnStart方法是否不需要string []參數作爲參數 – JsonStatham 2016-09-22 10:38:35

+1

您沒有顯示Start()方法的內容,但是您所做的事情給了我不好的感覺。我擔心你每天都會創建48個StreamingSubscriptionConnection對象,並且他們不能被垃圾收集,因爲他們有一個鏈接到它們的事件處理程序方法。所以你可能有內存泄漏。一個很小的,在更大的計劃中,但仍然... – RenniePet 2017-10-14 03:44:18

1

如果其他人有興趣,這是我如何完成這一點。

我想保持連接打開,所以我在OnDisconnect處理程序中重置它。

但是,在重置它之前,我使用反射來檢查連接對象上的私人「訂閱」字典。

這允許我取消訂閱我的代碼中其他位置的連接(OnNotificationEvent),並且當所有訂閱都已取消訂閱時,我可以關閉連接。

這裏是我的代碼:

void connection_OnDisconnect(object sender, SubscriptionErrorEventArgs args) 
    { 
     var c = (Dictionary<string, StreamingSubscription>)typeof(StreamingSubscriptionConnection).GetField("subscriptions",System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetValue(sender); 

     if (c.Count > 0) 
     { 
      // reopen the connection 
      ((StreamingSubscriptionConnection)sender).Open(); 

      using (var db = new Metrics_DatabaseEntities()) 
      { 
       PushNotificationTest pt = new PushNotificationTest(); 
       pt.RetObj = "Connection reset"; 

       db.PushNotificationTests.Add(pt); 

       db.SaveChanges(); 

      } 
     } 
     else 
     { 
      using (var db = new Metrics_DatabaseEntities()) 
      { 
       PushNotificationTest pt = new PushNotificationTest(); 
       pt.RetObj = "Connection closed!"; 

       db.PushNotificationTests.Add(pt); 

       db.SaveChanges(); 

      } 
     } 
    } 

請忽略窮人的方式,這是寫的,這只是我的第一個版本,因爲我打算這更乾淨儘快寫信。我只是認爲我會與可能感興趣的人分享我的方法。