2016-11-09 18 views
0

У меня есть следующий сценарий: Я проверяю почтовый ящик, на который отправляются электронные письма с некоторой релевантной информацией, чтобы получить информацию от него.EWS API Search Filter не возвращает всю информацию

Я использую много поисковых фильтров, чтобы найти конкретный адрес электронной почты и получить правильный:

var collection = new SearchFilter.SearchFilterCollection(LogicalOperator.And); 
collection.Add(new SearchFilter.ContainsSubstring(ItemSchema.Body, "text1", ContainmentMode.Substring, ComparisonMode.Exact)); 
collection.Add(new SearchFilter.ContainsSubstring(ItemSchema.Body, "text2", ContainmentMode.Substring, ComparisonMode.Exact)); 
collection.Add(new SearchFilter.ContainsSubstring(ItemSchema.Body, "text3", ContainmentMode.Substring, ComparisonMode.Exact)); 
collection.Add(new SearchFilter.ContainsSubstring(ItemSchema.Body, "text4", ContainmentMode.Substring, ComparisonMode.Exact)); 
collection.Add(new SearchFilter.ContainsSubstring(ItemSchema.Body, "text5", ContainmentMode.Substring, ComparisonMode.Exact)); 
collection.Add(new SearchFilter.ContainsSubstring(ItemSchema.Body, "longer string 1", ContainmentMode.Prefixed, ComparisonMode.IgnoreCase)); 

Но теперь у меня есть проблема, что я не всегда найти правильные сообщения электронной почты. Я проверил это очень просто: я отправил сообщение на этот почтовый ящик, который я просматриваю, который выглядит полностью равным другому сообщению. В обоих случаях включена вся информация сверху. Но потом, после того, как я что-то изменил на своих поисковых фильтрах или что-то, я неожиданно увидел правильный результат, последнее сообщение.

Я понятия не имею, что может вызвать проблему, потому что она такая нежизнеспособная.

ответ

0

Ваш запрос выглядит очень сложным и будет очень дорогостоящим с точки зрения производительности сервера. Например, ваш Фильтр поиска необходимо преобразовать в ограничение MAPI, а затем применить к серверу https://technet.microsoft.com/en-us/library/cc535025(v=exchg.80).aspx, как вы продолжаете применять несколько подстрок. Я сомневаюсь, что это будет надежным, если набор данных не будет достаточно большим. Поскольку ограничения кэшируются сервером, поведение, которое вы видите, возможно, просто время, которое бэкэнд берет на себя, чтобы создать или обновить ограничение. (например, если ваш запрос повторяется снова и получает очень быстрый ответ, который указывает на кешированный результат) или его просто процесс форсирования создаваемого нового, который сначала находит новейшие элементы.

Вам будет гораздо лучше обслуживать либо более удобный фильтр поиска, и работу с большим количеством элементов на стороне клиента, где текст может обрабатываться различными способами. Или посмотрите на использование AQS (или KQL в 2013 году) https://msdn.microsoft.com/en-us/library/office/dn579420(v=exchg.150).aspx, после чего вы выполняете запросы ключевых слов в индексах содержимого (для которых оптимизирован процесс поиска). Хотя вы можете получить больше ложных срабатываний таким образом, это должно быть намного быстрее и надежнее, а фильтрация ложных срабатываний у клиента намного проще.

Если вы хотите использовать Rest Cache, вам нужно использовать Raw Soap, так как я не верю, что Managed API его поддержит. Его атрибут элемента QueryString, например

<?xml version="1.0" encoding="utf-8"?> 
    <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" 
        xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" 
        xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
     <soap:Header> 
     <t:RequestServerVersion Version="Exchange2010" /> 
     </soap:Header> 
     <soap:Body> 
     <m:FindItem Traversal="Shallow"> 
      <m:ItemShape> 
      <t:BaseShape>IdOnly</t:BaseShape> 
      <t:AdditionalProperties> 
       <t:FieldURI FieldURI="item:Subject" /> 
      </t:AdditionalProperties> 
      </m:ItemShape> 
      <m:IndexedPageItemView MaxEntriesReturned="1" Offset="0" BasePoint="Beginning" /> 
      <m:ParentFolderIds> 
      <t:DistinguishedFolderId Id="inbox" /> 
      </m:ParentFolderIds> 
      <m:QueryString ResetCache="true">subject:Autodiscover</m:QueryString> 
     </m:FindItem> 
     </soap:Body> 
    </soap:Envelope> 
+0

Спасибо, что помогло, по крайней мере, найти большинство предметов. Но похоже, что он кэширует результат, потому что снова: я вызываю поиск строки запроса, получил результат, который является актуальным, затем я отправляю другое электронное письмо, и теперь результат не включает последнее электронное письмо. Но когда я снова и снова заново ** **, я нахожу последний элемент, например, есть какой-либо способ кэширования, которого я не знаю. Возможно, вы знаете, как использовать этот флаг ResetCache в queryString, как это упоминается в MSDN? – Zumarta

+0

Хотел добавить: похоже, есть какая-то задержка. Если я подожду как 1 или 2 минуты, я получаю правильный результат. Я не понимаю этого поведения, потому что Outlook, похоже, получает информацию напрямую, но результат EWS, похоже, не обновлен или отличается ... – Zumarta

+0

Я обновил свой ответ на примере использования ResetCache. Индексирование содержимого - это фоновый процесс, поэтому запрос индексов Ci Indexes Query будет всегда немного отставать. –