2012-07-16 84 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的列表服务的字典,其中第一个成员是主要的服务。