0

При работе с NotificationEvents в EWS представлены следующие документы MSDN https://msdn.microsoft.com/en-us/library/office/hh312849(v=exchg.140).aspx, написанные Хеннинг Краузе.Уведомления о событиях на .NET в Exchange Server Управляемый API EWS

показывает 2 разные подходы к решению тему см код ниже:

EX 1

private static void OnNotificationEvent(object sender, NotificationEventArgs args) 
    { 
     // Extract the item ids for all NewMail Events in the list. 
     var newMails = from e in args.Events.OfType<ItemEvent>() 
         where e.EventType == EventType.NewMail 
         select e.ItemId; 

     // Note: For the sake of simplicity, error handling is ommited here. 
     // Just assume everything went fine 
     var response = _ExchangeService.BindToItems(newMails, 
                new PropertySet(BasePropertySet.IdOnly, ItemSchema.DateTimeReceived, 
                    ItemSchema.Subject)); 
     var items = response.Select(itemResponse => itemResponse.Item); 

     foreach (var item in items) 
     { 
      Console.Out.WriteLine("A new mail has been created. Received on {0}", item.DateTimeReceived); 
      Console.Out.WriteLine("Subject: {0}", item.Subject); 
     } 
    } 

    private static void OnSubscriptionError(object sender, SubscriptionErrorEventArgs args) 
    { 
     // Handle error conditions. 
     var e = args.Exception; 
     Console.Out.WriteLine("The following error occured:"); 
     Console.Out.WriteLine(e.ToString()); 
     Console.Out.WriteLine(); 
    } 


} 

EX 2

private static void OnNotificationEvent(object sender, NotificationEventArgs args){ 
    foreach (var notification in args.Events){ 
     if (notification.EventType != EventType.NewMail) continue; 
     Console.WriteLine("A new mail has been created"); 
     var itemEvent = (ItemEvent) notification; 
     Console.WriteLine("The item ID of the new mail is {0}", itemEvent.ItemId.UniqueId); 
    } 
} 

Каковы отличия/преимущества использования одного подхода над другим?

В примере показано, как обрабатывать только один конкретный EventType, но в моем приложении я действительно хочу знать, когда и элементы получат 1. Обновлено и 2. Удалено.

Смотрите ниже:

Private Sub OnEvent(sender As System.Object, args As NotificationEventArgs) 
    Dim oGuid As New Guid(DefaultExtendedPropertySet.PublicStrings) 
    Dim oInternalContactId As New ExtendedPropertyDefinition(oGuid, conContactIdPropertyName, MapiPropertyType.Integer) 
    Dim oDateAdded As New ExtendedPropertyDefinition(oGuid, conDteAddedPropertyName, MapiPropertyType.String) 
    Dim oDateUpdated As New ExtendedPropertyDefinition(oGuid, conDteUpdatedPropertyName, MapiPropertyType.String) 
    Dim lstUpdatedContactIds As New List(Of ItemId) 
    Dim lstDeletedContactIds As New List(Of ItemId) 
    Dim lstUpdatedContacts As New List(Of Contact) 
    Dim lstDeletedContacts As New List(Of Contact) 
    Dim oUpdatedContacts As ServiceResponseCollection(Of GetItemResponse) 
    Dim oDeletedontacts As ServiceResponseCollection(Of GetItemResponse) 
    Dim intInternalContactId As Integer 

    lstUpdatedContactIds = From e In args.Events.OfType(Of ItemEvent)() 
          Where e.EventType = EventType.Modified 
          Select e.ItemId 

    lstDeletedContactIds = From e In args.Events.OfType(Of ItemEvent)() 
          Where e.EventType = EventType.Deleted 
          Select e.EventType 


    If lstUpdatedContactIds.Count > 0 Then 
     oUpdatedContacts = args.Subscription.Service.BindToItems(lstUpdatedContactIds, New PropertySet(BasePropertySet.FirstClassProperties, oInternalContactId, oDateAdded, oDateUpdated)) 
     lstUpdatedContacts = oUpdatedContacts.Where(Function(collection) collection.Item.TryGetProperty(oInternalContactId, intInternalContactId)) 
    End If 

    If lstDeletedContactIds.Count > 0 Then 
     oDeletedontacts = args.Subscription.Service.BindToItems(lstDeletedContactIds, New PropertySet(BasePropertySet.FirstClassProperties, oInternalContactId, oDateAdded, oDateUpdated)) 
     lstDeletedContacts = oDeletedontacts.Where(Function(collection) collection.Item.TryGetProperty(oInternalContactId, intInternalContactId)) 
    End If 

    Next 
End Sub 

ли я в правильном направлении, следуя подходу в EX 1 или я лучше следующий EX 2?

Если OnNotificationEvent срабатывает каждый раз, когда событие поймано, почему мы ожидаем сборку событий (EX 1) и используя LINQ, разве мы не должны ожидать одно событие?

Как Exchange обрабатывает несколько непрерывных уведомлений о событиях из разных почтовых ящиков, автоматически ли они обходятся до тех пор, пока мы их не обработаем?

Помните, что одновременно отслеживаю сотни почтовых ящиков.

Спасибо!

ответ

1

Как вы узнаете, что похоже на сдержанное действие в Exchange, например. создается новый элемент, часто приводящий к множеству уведомлений, передаваемых вашему обработчику событий. Теперь я занимался исключительно календарями, и рабочий процесс там для автоматического принятия вызывает многократные события все время. Со стандартными элементами электронной почты в папке «Входящие» я не уверен, что произойдет, но возможно, что могут произойти изменения вместе с событиями NewMail. По моему опыту, многократные уведомления в каждом вызове обработчика событий всегда предназначены для одного почтового ящика.

Я не совсем понимаю разницу между EX1 и EX2, но я бы посоветовал вам НЕ использовать BindToItems в обработчике событий. Лучше сохранить параметры ItemIds и уведомления и обработать их в другом потоке основной линии. Как и для любого обработчика событий, вы хотите минимизировать время, в которое вы находитесь.

НТН

+0

Спасибо за обратную связь на самом деле это имеет смысл обрабатывать эти события в отдельном потоке, однако я читала где-то, что мы не можем использовать ту же услугу на отдельные потоки https://social.msdn.microsoft.com/ Форумы/en-US/2ca2872a-3120-42de-a84b-2aca09fe1528/ews-manage-api-thread-safe? Forum = exchangesvrdevelopment – rojobo

+0

Да, объект ExchangeService не является потокобезопасным, но если вы можете управлять каждым MB в словаре объектов ExchangeService (по одному для каждого МБ), вы можете просто использовать разные объекты. Я не думаю, что они такие дорогие с точки зрения памяти. – pjneary

+0

Спасибо, сэр, очень информативный ответ. Я очень ценю это, что вы подразумеваете под основной линией? Могу ли я запустить новую задачу внутри обработчика? – rojobo