EWS returns ServiceError.ErrorItemNotFound 间歇性

EWS returns ServiceError.ErrorItemNotFound intermittently

我们有一个 Outlook 插件,可以在保存新的约会项目时回调我们的服务器。插件 return 是 Outlook 项目 ID。我们调用 ConvertId 以获取 EWS 项目 ID。这里,itemId 是 Outlook 项目 ID。

AlternateId _alternateId = new AlternateId();
_alternateId.Format = idFormat;
_alternateId.Mailbox = mailboxAddress;
_alternateId.UniqueId = itemId;

AlternateIdBase _altBase = _exchangeService.ConvertId(_alternateId, IdFormat.EwsId);

这总是有效的,或者至少,我们总能得到一个 EWS 项目 ID returned。

稍后,我们尝试获取约会项进行更新。这里,itemId 是 EWS 项目 ID。

// get the appointment using the EWS item Id of the appointment
Appointment appointment;
try
{
    appointment = Appointment.Bind(_exchangeService, new ItemId(itemId), propertySet);
    _exchangeService.LoadPropertiesForItems(new[] { appointment }, ExchangeWebService.GetRequiredPropertySet());
    return new ExchangeAppointment(appointment, exchangeUserName);
}

问题是很少(可能是 1% 的时间)和间歇性地,获取约会失败 ServiceError.ErrorItemNotFound。同一个用户可以在我们遇到问题的约会之后立即创建一个新的约会,并且它会起作用。

我们认为可能 ConvertId 到 return Exchange 服务器完全同步来自 Outlook 的项目之前的项目 ID,因此我们添加了每 10 秒重试一次,最多10分钟。在所有失败的情况下,我们都会看到重试发生但总是超过 10 分钟,此时我们放弃并记录异常。

我们可以在 Outlook 中看到受影响的项目,并且用户没有删除它们。

EWS 日志只是反映了 ServiceError.ErrorItemNotFound 异常。

不知下一步该去哪里?

我会看一下失败案例中的值。从 ConvertId 返回什么值,以及项目的现有值是什么(您可以使用 EWSEditor 来获取它)。也许通过比较这些值,您可以更好地了解正在发生的事情。