2012-07-16 41 views
1

只需要在每次有人添加新約會或對他/她所做的任何更改時收到通知。使用EWS API從多個人收聽日曆中的活動

我知道如何做到這一點的唯一方法,就是使用 service.SubscribeToStreamingNotifications 但問題就在這裏,它只是監聽到該服務勢必會在這樣

var service = new ExchangeService(ExchangeVersion.Exchange2010_SP2) 
{ 
    Credentials = new WebCredentials(userName, password) 
}; 

service.SubscribeToStreamingNotifications(new FolderId[] 
{ 
    WellKnownFolderName.Calendar 
}, EventType.FreeBusyChanged, EventType.Deleted); 

喜歡帳戶我已經通過創建一個服務列表來解決這個問題,每個服務都被綁定給不同的用戶,應用程序應該聽取每個服務。

這種方式的問題是我需要每個帳戶的密碼我不會聽它的事件,這在現實世界中是不可能的。

那麼有沒有什麼辦法來解決這個問題?

+0

您是否認爲模仿? – 2012-07-16 10:40:20

回答

0

您將不得不爲每個用戶創建一個服務實例。沒有辦法訂閱其他用戶文件夾。

但是,也可以使用拉取和推送訂閱來代替StreamingNotifications。 事情是這樣的:

List<FolderId> folders = new List<FolderId>(); 
folders.Add(new FolderId(WellKnownFolderName.Calendar)); 
PullSubscription subscription = = service.SubscribeToPullNotifications(folders, 1440, watermark, EventType.Created, EventType.Deleted, EventType.Modified, EventType.Moved, EventType.NewMail); 

一段時間後....

GetEventsResults currentevents = m_subscription .GetEvents(); 
+0

感謝您的回答,但我正在使用StreamingNotifications,因此當出現一些更改時,我會立即收到通知 – BraveHeart 2012-08-01 08:20:48

1

我已經解決了這個問題,通過創建服務的列表,所有的服務都主要ExchangeService的克隆,具有相同的管理員帳戶憑據,但他們冒充其他帳戶。

注意:您需要設置服務器,以便允許模擬。

private void ImpersonateUsers(ICollection<string> userSmtps) 
     { 
      if (userSmtps != null) 
       if (userSmtps.Count > 0) 
       { 
        foreach (var userSmtp in userSmtps) 
        { 
         if (_services.ContainsKey(userSmtp)) continue; 
         var newService = new ExchangeService(ExchangeVersion.Exchange2010_SP2); 

         try 
         { 
          var serviceCred = ((System.Net.NetworkCredential)(((WebCredentials)(_services.First().Value.Credentials)).Credentials)); 
          newService.Credentials = new WebCredentials(serviceCred.UserName, serviceCred.Password, serviceCred.Domain); 
          newService.AutodiscoverUrl(serviceCred.UserName + "@" + serviceCred.Domain, RedirectionUrlValidationCallback); 
          newService.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, userSmtp); 
         } 
         catch (Exception ex) 
         { 
          System.Diagnostics.Debug.WriteLine(ex.Message); 
         } 
         _services.Add(userSmtp, newService); 
        } 
       } 
     } 

哪裏userSmtps是電子郵件地址,我想模仿和_services的列表服務的字典,其中第一個成員是主要的服務。