ExchangeService FindItems внезапно периодически не работает - PullRequest
1 голос
/ 15 октября 2019

Это прекрасно работало, вероятно, год или больше, но вдруг, я думаю, что по состоянию на субботу 12 октября он начал давать сбой (FindResults не возвращает ничего);

        //Tag the sent email so we can pull it back in a moment
        Guid myPropertySetId = new Guid("{375a1079-a049-4c2d-a2e1-983d588cbed4}");
        ExtendedPropertyDefinition myExtendedPropertyDefinition = new ExtendedPropertyDefinition(myPropertySetId, "TelEmailGuid", MapiPropertyType.String);
        Guid telEmailGuid = Guid.NewGuid();
        message.SetExtendedProperty(myExtendedPropertyDefinition, telEmailGuid.ToString());

        //Send the email
        message.SendAndSaveCopy(completedFolder);

        //Find the sent email
        ItemView view = new ItemView(1);
        SearchFilter searchFilter = new SearchFilter.IsEqualTo(myExtendedPropertyDefinition, telEmailGuid.ToString());
        view.PropertySet = new PropertySet(BasePropertySet.IdOnly);
        FindItemsResults<Item> findResults = service.FindItems(completedFolder, searchFilter, view);

        return DownloadEmail(findResults.FirstOrDefault().Id.ToString());

Я попытался немного подправитьподождать, прежде чем пытаться найти электронную почту, это помогло (сейчас, может быть, 10% успешно). Затем я добавил цикл, поэтому, если он не найден, он будет повторяться несколько раз. Но кажется, что если он не найден в первый раз, он не найден при последующих попытках;

        //Tag the sent email so we can pull it back in a moment
        Guid myPropertySetId = new Guid("{375a1079-a049-4c2d-a2e1-983d588cbed4}");
        ExtendedPropertyDefinition myExtendedPropertyDefinition = new ExtendedPropertyDefinition(myPropertySetId, "TelEmailGuid", MapiPropertyType.String);
        Guid telEmailGuid = Guid.NewGuid();
        message.SetExtendedProperty(myExtendedPropertyDefinition, telEmailGuid.ToString());

        //Send the email
        message.SendAndSaveCopy(completedFolder);

        //Find the sent email
        ItemView view = new ItemView(1);
        SearchFilter searchFilter = new SearchFilter.IsEqualTo(myExtendedPropertyDefinition, telEmailGuid.ToString());
        view.PropertySet = new PropertySet(BasePropertySet.IdOnly);

        int attempt = 1;
        System.Threading.Thread.Sleep(1000);
        FindItemsResults<Item> findResults = service.FindItems(completedFolder, searchFilter, view);

        while (findResults.TotalCount == 0 && attempt < 5)
        {
            findResults = service.FindItems(completedFolder, searchFilter, view);
            attempt++;
        }

        return DownloadEmail(findResults.FirstOrDefault().Id.ToString());

У кого-нибудь есть какие-либо предложения? Я подозреваю, что это проблема Microsoft, но, возможно, другой подход мог бы позволить нам обойти эту проблему.

1 Ответ

1 голос
/ 16 октября 2019

Похоже, это проблема с тайм-аутом поиска, потому что если вы не выполняете поиск по индексируемому свойству, так как счетчик папок увеличивается, производительность поиска со временем снижается (также другие факторы, такие как загрузка сервера и т. Д., Будут оказывать прямое влияние при поиске. для элемента в папке с большим количеством элементов).

Ваш поиск выглядит довольно статично, поэтому вы можете создать папку поиска https://docs.microsoft.com/en-us/previous-versions/office/developer/exchange-server-2010/dd633690(v%3Dexchg.80), которая бы оптимизировала поиск.

Другойчто вы, возможно, сможете сделать, это добавить ограничение DateTime для поиска, например, у меня есть код, который ищет сообщения на основе интернет-идентификатора сообщения, и у него возникает аналогичная проблема, когда число элементов увеличивается при поиске. Так как я знаю, что я ищу, это всегда недавнее электронное письмо, добавление ограничения даты и времени устранило проблему в этом случае, например

        SearchFilter internetMessageIdFilter = new SearchFilter.IsEqualTo(PidTagInternetMessageId, InternetMessageId);
        SearchFilter DateTimeFilter = new SearchFilter.IsGreaterThan(EmailMessageSchema.DateTimeReceived, DateTime.Now.AddDays(-1));
        SearchFilter.SearchFilterCollection searchFilterCollection= new SearchFilter.SearchFilterCollection(LogicalOperator.And);
        searchFilterCollection.Add(internetMessageIdFilter);
        searchFilterCollection.Add(DateTimeFilter);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...