1

簡単に言えば、誰かが新しい予定を追加したり、自分の持ち物に変更を加えたりするたびに通知を受け取りたいのです。

私がそれを行う方法を知っている唯一の方法は、 service.SubscribeToStreamingNotifications を使用することですが、サービスがこのようにバインドされているアカウントのみをリッスンするという問題があります

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

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

各サービスが異なるユーザーにバインドされ、アプリケーションがそれぞれをリッスンする必要があるサービスのリストを作成することで、この問題を解決しました。

この方法の問題は、イベントを聞くために各アカウントのパスワードを取得する必要があることです。これは現実の世界では不可能です。

それで、それに対処する方法はありますか?

4

2 に答える 2

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 はサービスの辞書で、最初のメンバーがメイン サービスです。

于 2012-08-01T08:28:25.093 に答える
0

ユーザーごとにサービス インスタンスを作成する必要があります。他のユーザーのフォルダを購読する方法はありません。

ただし、StreamingNotifications の代わりに、Pull および Push-Subscriptions も使用できます。このようなもの:

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();
于 2012-07-16T14:45:07.820 に答える