Определение типа элемента при обработке события в веб-службах Exchange (EWS)

#c# #exchangewebservices

#c# #exchangewebservices

Вопрос:

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

Тип элемента, возвращаемый службой (Назначение), несовместим с запрошенным типом элемента (EmailMessage).

Похоже, должен быть способ определить тип элемента, прежде чем пытаться его привязать, но я не уверен, что это такое. Ошибка возникает при попытке Bind , поэтому я не могу просто проверить наличие null. Я мог бы прибегнуть к try/catch , но предпочел бы сделать это правильно, если есть лучший способ?

Обобщенный код:

 void streamingConnection_OnNotificationEvent(object sender, NotificationEventArgs args)
{
    foreach (NotificationEvent notificationEvent in args.Events)
    {
        ItemEvent itemEvent = notificationEvent as ItemEvent;
        if (itemEvent != null) HandleItemEvent(itemEvent);
    }
}

private void HandleItemEvent(ItemEvent itemEvent)
{
    switch (itemEvent.EventType)
    {
        case EventType.Modified:
            EmailMessage modifiedMessage = EmailMessage.Bind(this.ExchangeService, itemEvent.ItemId);
            // error occurs on Bind if the item type is not an EmailMessage (eg, an Appointment)
            break;
    }
}
  

Ответ №1:

Похоже, что правильный способ привязки — использовать общий Item.Bind метод, а затем проверить, является ли элемент EmailMessage типом. Чтобы сделать это надежно (обрабатывать потенциальные проблемы, связанные с перемещением элемента до его привязки) Я ввел логику в метод, аналогичный приведенному ниже:

 private EmailMessage BindToEmailMessage(ItemId itemId)
{
    try
    {
        Item item = Item.Bind(this.ExchangeService, itemId);
        if (item is EmailMessage) return item as EmailMessage;
        else return null;
    }
    catch
    {
        return null;
    }
}
  

Затем измените логику в моем существующем методе на

 EmailMessage modifiedMessage = BindToEmailMessage(itemEvent.ItemId);
if (modifiedMessage != null) ...