ExchangeService FindItems 突然间歇性不工作

ExchangeService FindItems Suddenly Intermittently Not Working

这可能已经完美运行了一年或更长时间,然后突然间,我认为从 10 月 12 日星期六开始它开始失败(FindResults returns 没有项目);

        //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 的问题,但或许可以通过不同的方法解决该问题。

这听起来像是搜索超时的问题,因为您没有搜索索引 属性 随着 FolderItem 计数的增加,搜索性能会随着时间的推移而下降(服务器负载等其他因素也会在项目数较多的文件夹中搜索项目时有直接影响。

您的搜索看起来非常静态,因此您可以创建一个搜索文件夹 https://docs.microsoft.com/en-us/previous-versions/office/developer/exchange-server-2010/dd633690(v%3Dexchg.80) 来优化搜索。

您可以做的另一件事是为搜索添加日期时间限制,例如我有代码可以根据 Internet MessageId 搜索消息,当项目计数变大时搜索超时时它会出现类似的问题.所以因为我知道我要搜索的总是最近的电子邮件,添加日期时间限制解决了这个例子中的问题,例如

        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);