EWS API搜索过滤器不会返回所有信息

时间:2016-11-09 13:03:18

标签: c# .net exchangewebservices ews-managed-api

我有以下情况: 我检查一个邮箱,其中发送了带有相关信息的电子邮件,以便从中获取信息。

我使用了大量搜索过滤器来查找特定的电子邮件并获取正确的电子邮件:

#include <iostream>
#include <string>

using namespace std;

int main(void) {
   cout << "Enter 4 words:" << endl;
   string a, b, c, d;
   cin >> a >> b >> c >> d;
}

但是现在我遇到的问题是我并不总能找到正确的电子邮件。我测试的非常简单:我向该邮箱发送了一条消息,我正在轮询,看起来完全等同于另一条消息。在这两种情况下,都包括上述所有信息。 但是,在我更改了SearchFilters或其他任何内容之后,我突然看到了正确的结果,即最新消息。

我不知道是什么原因导致这个问题,因为它非常普遍。

1 个答案:

答案 0 :(得分:0)

您的查询看起来非常复杂,在服务器性能方面会非常昂贵。例如,您的搜索过滤器需要转换为MAPI限制,然后应用于服务器https://technet.microsoft.com/en-us/library/cc535025(v=exchg.80).aspx,就像您继续应用多个子字符串一样我怀疑是否可靠,除非数据集您的查询非常小。由于服务器缓存了限制,因此您看到的行为可能只是后端构建或刷新限制的时间。 (例如,如果您再次查询相同的内容并获得指示缓存结果的非常快速的响应),或者只是强制创建新的响应的过程,该过程首先找到最新的项目。

通过使搜索过滤器更简单,并在客户端处理更多项目,文本可以通过许多不同的方法处理,您会得到更好的服务。或者看看使用AQS(或2013年的KQL)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>