ExchangeService.FindFolders 未返回任何文件夹

ExchangeService.FindFolders not returning any folders

我有一个循环遍历邮箱中多个已定义文件夹的功能。每个文件夹都包含另一个名为 "Complete" 的文件夹。下面的代码找到这个 "Complete" 文件夹并获取它的 FolderId.

当 运行 时,代码工作正常,然后一段时间后 FindFoldersResults findFolderProcessed = service.FindFolders(folder.Id, new SearchFilter.IsEqualTo(FolderSchema.DisplayName, "Complete"), view); returns 没有文件夹。单步执行代码,似乎一切正常,但 findFolderProcessed.Folders 是空的。

为什么它适用于多个文件夹然后停止?

ServicePointManager.ServerCertificateValidationCallback =
    ((sender, certificate, chain, sslPolicyErrors) => true);

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP2);
service.Credentials = new NetworkCredential("xxx", "xxx", "xxx");
service.AutodiscoverUrl("xxx@xxx.com");
service.Url = new Uri("https://xxx/ews/exchange.asmx");

FolderView view = new FolderView(int.MaxValue);
view.PropertySet = new PropertySet(BasePropertySet.IdOnly);
view.PropertySet.Add(FolderSchema.DisplayName);
view.Traversal = FolderTraversal.Deep;

SearchFilter[] parameters = new SearchFilter[3];
parameters[0] = new SearchFilter.IsEqualTo(FolderSchema.DisplayName, "x1");
parameters[1] = new SearchFilter.IsEqualTo(FolderSchema.DisplayName, "x2");
parameters[2] = new SearchFilter.IsEqualTo(FolderSchema.DisplayName, "x3");

SearchFilter.SearchFilterCollection filterCollection = new SearchFilter.SearchFilterCollection(LogicalOperator.Or, parameters);

FindFoldersResults findFolder = service.FindFolders(new FolderId(WellKnownFolderName.Inbox, new Mailbox("xxx@xxx.com")), filterCollection, view);

foreach (Folder folder in findFolder.Folders)
{
    //FindFoldersResults tempResults = service.FindFolders(folder.Id, view);
    FindFoldersResults findFolderProcessed = service.FindFolders(folder.Id, new SearchFilter.IsEqualTo(FolderSchema.DisplayName, "Complete"), view);
    FolderId ProcessedFolderID = findFolderProcessed.Folders[0].Id;

    //Other Processing
}

编辑:示例文件夹结构

x1
 -> Complete
x2
 -> Complete
x3
 -> Complete
...
xn
 -> Complete

大约有 50 个文件夹,结构完全相同。

所以问题是 service.FindFolders 返回了重复的文件夹,并且循环试图处理这些文件夹两次。所以它第一次正确地处理了文件夹,但第二次它导致了这个问题。

我不知道为什么它会返回重复项,但为了修复它,我只是使用下面的代码代替 foreach (Folder folder in findFolder.Folders):

来删除 findFolder
var folderCollection = findFolder.Folders.GroupBy(x => x.DisplayName).Select(g => g.First());

foreach (Folder folder in folderCollection)

如果有人知道为什么文件夹会在最初的 service.FindFolders 调用中重复,请随时在下面发表评论。