我正在使用C#控制台应用程序,该应用程序使用Exchange Web服务(EWS)为11个用户创建和/或更新Outlook联系人。
应用程序需要冒充这11个用户才能正确创建/更新各自的Outlook联系人。
该应用程序有一个专门的[ServiceAccount]
,他恰好是ApplicationImpersonation
管理员角色的成员。
我启动了应用程序并且运行正常。
要验证一切正常,我导航到Office 365并登录User1的帐户(使用他的凭据),我可以看到223个新创建的联系人。
我很开心,我退出了。
第二天,我做的第一件事是登录User1的帐户(使用他的凭据),我不再看到223个联系人,而是看到7个联系人。
由于未知原因,216个联系人已完全从User1的联系人中消失。
我查看了User1的已删除项目,我在那里看到了这216个联系人......
如何开始研究这个?我不是交流专家。
以下是我用来创建联系人的代码
private void AddNewOutlookContacts(IEnumerable<Person> contactsToCreate, string emailToImpersonify)
{
var service = new ExchangeService(ExchangeVersion.Exchange2013);
service.Credentials = new NetworkCredential(_serviceAccount, _serviceAccountPwd, _domain);
service.Url = new Uri(_office365ExchangeUrl);
service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, emailToImpersonify);
Collection<Contact> contactItems = new Collection<Contact>();
foreach (var c in contactsToCreate)
{
Contact newContact = new Contact(service);
newContact.GivenName = c.FirstName;
newContact.MiddleName = c.LastName;
newContact.FileAsMapping = FileAsMapping.SurnameCommaGivenName;
newContact.DisplayName = string.Format("{0} {1}", c.FirstName, c.LastName);
newContact.PhoneNumbers[PhoneNumberKey.HomePhone] = c.HomePhone;
newContact.PhoneNumbers[PhoneNumberKey.BusinessPhone] = c.WorkPhone;
newContact.PhoneNumbers[PhoneNumberKey.MobilePhone] = c.CellPhone;
newContact.EmailAddresses[EmailAddressKey.EmailAddress1] = new EmailAddress(c.Email);
newContact.JobTitle = c.JobTitle;
contactItems.Add(newContact);
}
// Batch Create...
ServiceResponseCollection<ServiceResponse> response = service.CreateItems(contactItems, WellKnownFolderName.Contacts, null, null);
if (response.OverallResult == ServiceResult.Success)
{
Console.WriteLine("SUCCESS");
}
else
{
Console.WriteLine("FAILED");
}
}
没有删除联系人的代码。
有关可能在Exchange上运行的内容的任何想法导致这些联系人自动消失。
我可以查看一个日志文件吗?
任何可以帮助我了解这一点的事情都会很棒!
最后一件事,联系人的消失发生在所有这11个用户身上。
答案 0 :(得分:1)
我找到了罪魁祸首,这是解决方案:
在我之前提供的代码中,我省略了(出于简洁的原因)我插入多个电子邮件地址这样的事实:
if (!string.IsNullOrEmpty(c.RLEmail))
newContact.EmailAddresses[EmailAddressKey.EmailAddress1] = new EmailAddress(c.Email);
if (!string.IsNullOrEmpty(c.PersonalEmail))
newContact.EmailAddresses[EmailAddressKey.EmailAddress2] = new EmailAddress(c.PersonalEmail);
if (!string.IsNullOrEmpty(c.UnionEmail))
newContact.EmailAddresses[EmailAddressKey.EmailAddress3] = new EmailAddress(c.UnionEmail);
虽然代码在插入电子邮件地址之前会检查IsNullOrEmpty()
,但代码不做的是验证这些电子邮件地址的唯一性。
这就是问题所在。
根据我的测试数据,我创建了一堆具有唯一EmailAddress1
的联系人。
但对于EmailAddress2
和EmailAddress3
,我的测试数据没有唯一的电子邮件地址,因此这两个字段中存在重复的地址。
出于某种原因,我的印象是这些第二和第三个电子邮件地址无关紧要,如果它们有重复但我错了(并且它们也是唯一的完美意义)。
简而言之,Exchange必须有正在运行的作业,以清除和删除在EmailAddress2
和EmailAddress3
中包含重复电子邮件地址的联系人。