2016-04-18 2 views
1

У меня есть функция, которая проходит через несколько определенных папок в почтовом ящике. Каждая из папок содержит другую папку под названием «Завершить». Нижеприведенный код находит эту «полную» папку и получает ее FolderId.ExchangeService.FindFolders не возвращает никаких папок

При запуске код работает нормально, а через некоторое время FindFoldersResults findFolderProcessed = service.FindFolders(folder.Id, new SearchFilter.IsEqualTo(FolderSchema.DisplayName, "Complete"), view); не возвращает никаких папок. Выполняя код, все кажется, что он должен работать, но 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("[email protected]"); 
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("[email protected]")), 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 
} 

EDIT: Пример структуры папок

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

Есть около 50 папок, структурированы точно так же.

+0

У вас возникла проблема с выпуском больших объектов, которые возникают здесь, когда и где вы когда-либо располагали созданных вами экземпляров 'new'd'. – MethodMan

+0

Можете ли вы воспроизвести это? Это происходит для определенной папки или происходит случайным образом? Можете ли вы показать свою структуру папок? – khlr

+0

MethodMan - Объекты, расположенные позже в коде, но эта проблема возникает, прежде чем я захочу распорядиться любым из них. khlr - Могу ли я воспроизвести это? Да, я воспроизвожу его каждый раз, когда я его запускаю. Кажется, это все те же папки каждый раз, я делаю больше испытаний вокруг этого, но я не знаю, почему. В главном вопросе я описал структуру папок. – anothershrubery

ответ

1

Так что проблема заключалась в том, что service.FindFolders возвращал повторяющиеся папки, и цикл пытался обрабатывать папки дважды. Таким образом, он правильно обрабатывал папки в первый раз, но во втором случае это вызывало эту проблему.

Я не знаю, почему это было бы возвращение дубликатов, но исправить это, я просто deduped findFolder, используя приведенный ниже код вместо foreach (Folder folder in findFolder.Folders):

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

foreach (Folder folder in folderCollection) 

Если кто-нибудь знает, почему эти папки были бы дублируется в начальном service.FindFolders звоните, не стесняйтесь комментировать ниже.