2011-05-06 99 views
6

我正在使用Microsoft Exchange Web Services 1.1 SDK並使用流連接訂閱新的郵件通知。所有工作都可以接收通知,但我每隔一段時間都會收到有關我的Exchange無法找到我的訂閱的錯誤。我的流媒體訂閱在哪裏?

下面是我用來初始化我的訂閱和我使用的事件的代碼。

public void Subscribe() 
{ 
    var locateMailbox = new Mailbox 
          { 
           Address = "myemail" 
          }; 
    var folderId = new FolderId(WellKnownFolderName.Inbox, locateMailbox); 
    var foldersToWatch = new[] {folderId}; 
    StreamingSubscription streamingSubscription = 
     _exchangeService.SubscribeToStreamingNotifications(foldersToWatch, EventType.NewMail); 
    // Timeout is set at 1 minute intentionally 
    var streamingConnection = new StreamingSubscriptionConnection(_exchangeService, 1); 

    streamingConnection.AddSubscription(streamingSubscription); 

    streamingConnection.OnSubscriptionError += ResolveError; 
    streamingConnection.OnDisconnect += Reconnect; 

    streamingConnection.Open(); 
} 

public void Reconnect(object sender, SubscriptionErrorEventArgs disconnectEventArgs) 
{ 
    if (!((StreamingSubscriptionConnection)sender).IsOpen) 
     ((StreamingSubscriptionConnection)sender).Open(); 
} 

public void ResolveError(object sender, SubscriptionErrorEventArgs errorEventArgs) 
{ 
    var streamingSubscriptionConnection = 
     (StreamingSubscriptionConnection) sender; 
    if (!streamingSubscriptionConnection.IsOpen) 
     streamingSubscriptionConnection.Open(); 
} 

ServiceLocalException - You must add at least one subscription to this connection before it can be opened.

這個例外是有目共睹的,我知道,我可以簡單地創建的Reconnect()內其他訂閱。我希望有人能幫我理解訂閱的去向。我無法想象像Exchange 2010這樣的產品會簡單地失去我的訂閱。另外,我不能指出錯誤。有時我可以保持我的訂閱活動時間爲10分鐘,而其他時間我收到有關我的訂閱在2-3分鐘後無效的錯誤。

對於我使用Exchange 2010 SP1的價值。

回答

7

從查看Reflector中的源代碼,它看起來像訂閱可以被刪除的唯一兩種方式(除去配置StreamingSubscriptionConnection,通過調用Remove,我假設你沒有做,或通過訂閱返回除ServiceError.ErrorMissedNotificationEvents以外的錯誤代碼您可以通過查看ResolveError處理程序中的errorEventArgs.Exception來檢查錯誤,如果它是ServiceResponseException的實例,則將其轉換爲該類型並獲取ErrorCode屬性。然後自動刪除

獲取錯誤代碼可能會幫助您找出發生這種情況的原因,但即使您無法修復它,您也可以呃,當訂閱將被刪除,並在這種情況下異步添加另一個訂閱。

+0

我照你的建議做了,我得到的錯誤代碼是'ErrorSubscriptionNotFound'。不知道爲什麼,因爲如果我深入瞭解'發送者'參數,我可以看到那裏有訂閱。 – Mike 2011-05-09 11:56:17

+1

錯誤代碼是來自服務器的錯誤。當您深入查看訂閱仍在時,您就在客戶端上。它是無法找到訂閱的服務器。我的猜測是服務器在一分鐘左右就放棄了訂閱,因爲你只給了一分鐘的超時時間。嘗試更長的超時時間並查看問題是否仍然存在。爲什麼你故意使用一分鐘超時? – 2011-05-09 13:20:29

+0

我將超時設置爲一分鐘,因爲我收到了30分鐘超時的相同錯誤。與其等待幾組30分鐘找到錯誤,我想更快地查看錯誤。但現在我想到了這一點,我仍然應該在防守方面編碼,以確保我始終保持積極的訂閱。你永遠不知道服務器何時會發生呃逆。謝謝。 – Mike 2011-05-09 13:24:47

1

我知道這是很久以前問的,但我想我會發布如何解決錯誤(無法找到任何解釋爲什麼發生)。順便也使用office 2010 sp1。

您可以使用來自發件人的Count()方法驗證您是否擁有活動訂閱;

private static void onDisconnect(object sender, SubscriptionErrorEventArgs args) 
    { 

     StreamingSubscriptionConnection renew = (StreamingSubscriptionConnection)sender; 
     if(renew.CurrentSubscriptions.Count() > 0){ //if subscription exists reopen as normal 
      renew.Open(); 
     } 
     else 
     { 
      //recreate the whole connection 
     } 
    }