【问题标题】:Listening to Events in the calendar from more than one person using EWS API使用 EWS API 从多个人那里收听日历中的事件
【发布时间】:2012-07-16 10:23:43
【问题描述】:

我只是想在每次有人添加新约会或对他/她所拥有的内容进行任何更改时收到通知。

我知道如何做到这一点的唯一方法是使用 service.SubscribeToStreamingNotifications 但是这里的问题是它只监听服务绑定喜欢的账号这种方式

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

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

我通过创建服务列表解决了这个问题,每个服务绑定到不同的用户,应用程序应该监听每个服务。

这种方式的问题是我需要拥有每个帐户的密码,我不会听它的事件,这在现实世界中是不可能的。

那么有什么办法可以解决这个问题吗?

【问题讨论】:

  • 您考虑过模拟吗?

标签: c# api events exchangewebservices exchange-server-2010


【解决方案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 是第一个成员是主要服务的服务字典。

【讨论】:

    【解决方案2】:

    您必须为每个用户创建一个服务实例。无法订阅其他用户文件夹。

    但您也可以使用 Pull 和 Push-Subscriptions 来代替 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();
    

    【讨论】:

    • 感谢您的回答,但我正在使用 StreamingNotifications,所以当有一些更改时,我会“立即”收到通知
    猜你喜欢
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 2019-07-21
    相关资源
    最近更新 更多