EWS C#ExchangeService.MoveItems问题

时间:2014-08-15 18:54:05

标签: c# exchangewebservices

我有一个EWS MoveItems问题,希望有人可以帮助我。在发送文件夹中有1300封电子邮件,我调用MoveItems方法将它们全部移动到备份文件夹中,只移动了一部分项目!寻找模式,我记录了以下测试数字:

测试#1:初始计数:1300;实际#Moved:722

测试#2:初始计数:1300;实际#Moved:661

测试#3:初始计数:1300;实际#Moved:738

对于每个测试用例,我的日志记录输出显示找到1300并传递给MoveItems方法,但是,检查已发送邮件文件夹显示并非所有1300都被移动(如上述测试中所示)。

以下是我的代码片段:

...
do
{
    ItemView view = new ItemView(pageSize, offset);
    findResults = service.FindItems(folder, emailFilter, view);

    Logger.Write("Email count on this page to be archived: " + findResults.Items.Count);

    foreach (Item email in findResults)
    {
        itemIds.Add(email.Id);
    }

    offset += pageSize;
}
while (findResults.MoreAvailable);

Logger.Write("Total email Ids to be archived: " + itemIds.Count());

if (itemIds.Count() > 0)
{
    Logger.Write("Archiving emails...");
    service.MoveItems(itemIds, folder5.Folders[0].Id);
    Logger.Write("Archive call complete.");
}
else 
{
    Logger.Write("No emails found to archive.");
}
...

所有这些都包含在try / catch块中。没有错误被捕获。

值得注意的唯一另一个有趣的项目是“存档电子邮件...”日志和“存档调用完成”之间的时间。总是在1分钟内的一两秒钟内。可能表示通话超时?这是我的日志片段:

8/15/2014 4:29:43 PM - Information - Archiving emails... 
8/15/2014 4:29:44 PM - Information - Creating search filters...
8/15/2014 4:29:48 PM - Information - Email count on this page to be archived: 1000
8/15/2014 4:29:49 PM - Information - Email count on this page to be archived: 300
8/15/2014 4:29:49 PM - Information - Total email Ids to be archived: 1300
8/15/2014 4:29:49 PM - Information - Archiving emails...
8/15/2014 4:30:51 PM - Information - Archive call complete.
8/15/2014 4:30:51 PM - Information - Email archival completed without errors

我的绳索已经结束了,所以我感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:1)

我在使用EWS时遇到了同样的问题。我不确定“正确”的解决方案是什么,但我的解决方案似乎有效。我描述了这一举动,它似乎很好地一次移动了几百件物品。尝试在每次调用MoveItems时移动~250。

答案 1 :(得分:0)

您应该尝试处理运行MoveItems方法时返回的ServiceResponses,例如

            if (itemIds.Count() > 0)
        {                
           ServiceResponseCollection<MoveCopyItemResponse> Responses =  service.MoveItems(itemIds, folder5.Id);
            Int32 Success = 0;
            Int32 Error = 0;
            foreach (MoveCopyItemResponse respItem in Responses) {
                switch (respItem.Result) {
                    case ServiceResult.Success: Success++;
                        break;
                    case ServiceResult.Error: Error++;
                        Console.WriteLine("Error with Item " + respItem.ErrorMessage);
                        break;
                }                  
           }
            Console.WriteLine("Results Processed " + itemIds.Count + " Success " + Success + " Failed " + Error);
        }

这将告诉你发生了什么以及为什么你的一些动作失败了。我怀疑它会受到限制,所以克里斯建议放弃你的批量大小。在过去,当我写邮件在邮箱和存档之间进行大的移动时,我去了100个项目的批量大小,从来没有遇到过问题。当我将批量大小设置得太大时,我看到了超时和油门错误。

干杯 格伦