EWS - 可能超时?

时间:2014-07-07 20:42:52

标签: c# exchangewebservices

我是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封电子邮件。没有模式。

非常感谢任何输入。

2 个答案:

答案 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。

希望它对某人有帮助。