При работе с 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 обрабатывает несколько непрерывных уведомлений о событиях из разных почтовых ящиков, автоматически ли они обходятся до тех пор, пока мы их не обработаем?
Помните, что одновременно отслеживаю сотни почтовых ящиков.
Спасибо!
Спасибо за обратную связь на самом деле это имеет смысл обрабатывать эти события в отдельном потоке, однако я читала где-то, что мы не можем использовать ту же услугу на отдельные потоки https://social.msdn.microsoft.com/ Форумы/en-US/2ca2872a-3120-42de-a84b-2aca09fe1528/ews-manage-api-thread-safe? Forum = exchangesvrdevelopment – rojobo
Да, объект ExchangeService не является потокобезопасным, но если вы можете управлять каждым MB в словаре объектов ExchangeService (по одному для каждого МБ), вы можете просто использовать разные объекты. Я не думаю, что они такие дорогие с точки зрения памяти. – pjneary
Спасибо, сэр, очень информативный ответ. Я очень ценю это, что вы подразумеваете под основной линией? Могу ли я запустить новую задачу внутри обработчика? – rojobo