我是EWS的新手,请原谅我,如果这很明显的话。我搜索过,找不到解决方案。
我有一个命令行C#实用程序,用于过滤电子邮件并将其组织到文件夹中。该应用似乎在逻辑上工作正常,但似乎在15分钟后超时没有错误。
该实用程序使用自动发现连接:
private ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP1);
...
// Connect using credentials and autodiscover
service.Credentials = new WebCredentials(userName, password, domain);
service.AutodiscoverUrl(emailServer);
然后在过滤后,它会遍历结果并将电子邮件移动到相应的文件夹中。像这样:
...
// Create a filter to only return unread messages
SearchFilter emailFilter = new SearchFilter.IsLessThan(EmailMessageSchema.DateTimeReceived, DateTime.Now.AddDays(-2));
// Retrieve the results
FindItemsResults<Item> findResults = service.FindItems(folder, emailFilter, view);
Logger.Write("Total emails to be archived: " + findResults.TotalCount);
...
try
{
...
foreach (Item email in findResults)
{
EmailMessage emailMessage = EmailMessage.Bind(service, email.Id);
emailMessage.Load();
emailMessage.Move(folder5.Folders[0].Id);
}
}
catch (Exception ex)
{
Logger.Write("Exception caught while moving emails: " + ex.Message);
throw ex;
}
...
Logger.Write("=== End Email Move Logic...");
我的第一个日志记录输出表明应该移动5,000封电子邮件,事实上,这个过程很顺利,但是15分钟后,我看到了最终的日志记录输出。表明一切都已完成。然而,总共5000个中只有一部分被移动了。奇怪的是,我没有在事件日志中看到异常或任何内容。
编辑:2014年7月9日
好的,我最初的问题是由于我没注意到FindItemsResults类使用分页!卫生署!因此即使它正确地报告了TotalCount(5000),当我遍历结果时,只有1000个正在被处理。像我这样的EWS noob并不是非常直观,但是你有它。
不幸的是,我有一个后续的挫折感。根据Brad的评论,我现在使用的是ExchangeService.MoveItems方法。在处理了分页问题之后,我现在有一个正确的itemIds(count = 5000)列表,我将其传递给MoveItems方法。像这样:
service.MoveItems(itemIds, folder5.Folders[0].Id);
令我惊讶的是,只有730封电子邮件被移动了。留下4270封电子邮件不为所动。因此,希望找到一个模式,我再次运行它,这次移动了671封电子邮件。没有模式。
非常感谢任何输入。
答案 0 :(得分:0)
搜索查询的超时是正常的,特别是对于大型文件夹。 会发生什么是Exchange不保持实时索引只响应您可以构建的任何搜索查询,因此它会超时响应并保持索引。 如果您稍后尝试发出相同的查询,则会成功。不幸的是,Exchange不提供有关何时的信息,只是继续尝试。返回第一页后,页面查询将立即返回。
BTW这不是一个限制问题,当达到限制限制时,您将收到明确的错误。 Exchange 2007只是说,2010年及更高版本为您提供了等待节流配额重新充值的价值。
答案 1 :(得分:0)
我很欣赏这是一个旧主题,但这是我在Google上找到的第一个主题,以为我会添加我的发现。
我对WPF应用进行了编码,以帮助将旧版Exchange公用文件夹迁移到Office 365托管的Exchange,并且在使用FindItems方法进行搜索时遇到了超时问题。具体来说,我正在一个日期范围内搜索公用文件夹中发送的日期,然后将找到的项目复制到Office 365公用文件夹中。如果我们使用较大的日期范围,则FindItems调用将超时。
为我们解决的问题是为ExchangeService设置超时值,默认值为100000毫秒,因此我们仅添加了另一个0来测试可能的解决方案。嘿,我们可以使用更大的日期范围。
ExchangeService service = new ExchangeService();
ExchangeService o365 = new ExchangeService();
switch (strArgs[6])
{
case "0":
service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
break;
case "1":
service = new ExchangeService(ExchangeVersion.Exchange2010);
break;
case "2":
service = new ExchangeService(ExchangeVersion.Exchange2010_SP1);
break;
case "3":
service = new ExchangeService(ExchangeVersion.Exchange2010_SP2);
break;
case "4":
service = new ExchangeService(ExchangeVersion.Exchange2013);
break;
case "5":
service = new ExchangeService(ExchangeVersion.Exchange2013_SP1);
break;
}
int nCount = 0;
// Connect to on-premises Exchange Server
callback(nCount, "Connecting to on-premises Exchange Server, please wait....", 0, true, mailItem);
service.Credentials = new WebCredentials(strArgs[0], strArgs[1]);
if (!useUrl)
service.AutodiscoverUrl(strArgs[2], RedirectionUrlValidationCallback);
else
service.Url = new Uri(strArgs[10] + "/EWS/Exchange.asmx");
service.Timeout = 1000000;
callback(nCount, "Connected to on-premises Exchange Server, please wait....", 0, true, mailItem);
// Connect to Office 365 Exchange Server
callback(nCount, "Connecting to Office 365 Exchange Server, please wait....", 0, true, mailItem);
o365.Credentials = new WebCredentials(strArgs[7], strArgs[8]);
o365.AutodiscoverUrl(strArgs[9], RedirectionUrlValidationCallback);
callback(nCount, "Connected to Office 365 Exchange Server, please wait....", 0, true, mailItem);
我们使用的分页值为500。 源Exchange版本是Exchange 2007 SP1。
希望它对某人有帮助。