Потоковая передача уведомлений о событиях почтовых ящиков с помощью веб-служб Exchange в Exchange
Узнайте, как использовать управляемый API EWS или EWS для подписки на потоковые уведомления и получения событий.
EWS в Exchange использует потоковые уведомления для получения уведомлений, отправляемых сервером через подключение, которое остается открытым в течение указанного периода времени.
Если вы подписываетесь на уведомления потоковой передачи с помощью управляемого API EWS, вы подписываетесь и получаете потоковые уведомления с помощью метода SubscribeToStreamingNotifications . Затем вы создаете подключение к подписке с помощью объекта StreamingSubscriptionConnection .
Чтобы подписаться на потоковые уведомления с помощью EWS, создайте подписку с помощью операции Подписка, анализируете ответ, а затем получаете уведомления потоковой передачи с помощью запроса операции GetStreamingEvents .
После того как клиент получает уведомления об изменениях или создании элементов на сервере, следующим шагом является синхронизация изменений.
Подписка на уведомления потоковой передачи и получение с помощью управляемого API EWS
В следующем примере кода показано, как использовать метод SubscribeToStreamingNotifications для подписки на уведомления потоковой передачи для всех событий в папке "Входящие". Затем создается подключение для подписки путем создания объекта StreamingSubscriptionConnection . В этом примере предполагается, что служба является допустимой привязкой ExchangeService .
// Subscribe to streaming notifications in the Inbox.
StreamingSubscription = service.SubscribeToStreamingNotifications(
new FolderId[] { WellKnownFolderName.Inbox },
EventType.NewMail,
EventType.Created,
EventType.Deleted,
EventType.Modified,
EventType.Moved,
EventType.Copied,
EventType.FreeBusyChanged);
// Create a streaming connection to the service object, over which events are returned to the client.
// Keep the streaming connection open for 30 minutes.
StreamingSubscriptionConnection connection = new StreamingSubscriptionConnection(service, 30);
connection.AddSubscription(StreamingSubscription);
connection.OnNotificationEvent += OnNotificationEvent;
connection.OnDisconnect += OnDisconnect;
connection.Open();
После получения событий от сервера следующим шагом является синхронизация этих изменений с сервером. Используйте один из методов отмены подписки, перечисленных в таблице 4 , чтобы завершить подписку на сервере, когда подписка больше не нужна.
Подписка на уведомления потоковой передачи с помощью EWS
В следующем примере показан XML-запрос, который отправляется клиентом на сервер, когда клиент вызывает операцию Подписаться для подписки на все EventTypes в папке "Входящие". Это также XML-запрос, который отправляет управляемый API EWS при использовании метода SubscribeToStreamingNotifications для подписки на потоковые уведомления.
<?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="https://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<t:RequestServerVersion Version="Exchange2013" />
</soap:Header>
<soap:Body>
<m:Subscribe>
<m:StreamingSubscriptionRequest>
<t:FolderIds>
<t:DistinguishedFolderId Id="inbox" />
</t:FolderIds>
<t:EventTypes>
<t:EventType>NewMailEvent</t:EventType>
<t:EventType>CreatedEvent</t:EventType>
<t:EventType>DeletedEvent</t:EventType>
<t:EventType>ModifiedEvent</t:EventType>
<t:EventType>MovedEvent</t:EventType>
<t:EventType>CopiedEvent</t:EventType>
<t:EventType>FreeBusyChangedEvent</t:EventType>
</t:EventTypes>
</m:StreamingSubscriptionRequest>
</m:Subscribe>
</soap:Body>
</soap:Envelope>
В следующем xml-примере показано сообщение SubscribeResponse , которое отправляется с сервера клиенту в ответ на запрос операции подписки . Включение значения NoError для элемента ResponseCode означает, что подписка создана успешно. Элемент SubscriptionId однозначно идентифицирует подписку на уведомления потоковой передачи на сервере.
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<h:ServerVersionInfo MajorVersion="15"
MinorVersion="0"
MajorBuildNumber="785"
MinorBuildNumber="6"
Version="V2_6"
xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<m:SubscribeResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<m:ResponseMessages>
<m:SubscribeResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:SubscriptionId>JgBibjFwcjAzbWIyMDIubmFtcHJkMDMucHJvZC5vdXRsb29rLmNvbRAAAADwXxVesOnHS5BxUHKwAW88SHjwd1iB0Ag=</m:SubscriptionId>
</m:SubscribeResponseMessage>
</m:ResponseMessages>
</m:SubscribeResponse>
</s:Body>
</s:Envelope>
После создания подписки теперь можно получить потоковые события с помощью идентификатора подписки , возвращенного в сообщении SubscribeResponse .
Получение событий потоковой передачи с помощью EWS
В следующем примере XML показано сообщение запроса операции GetStreamingEvents , которое клиент отправляет на сервер для получения уведомлений о идентификаторе подписки , возвращенном в сообщении SubscribeResponse . Запрос операции GetStreamingEvents указывает, что длина подключения составляет 30 минут.
<?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="https://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<t:RequestServerVersion Version="Exchange2013" />
</soap:Header>
<soap:Body>
<m:GetStreamingEvents>
<m:SubscriptionIds>
<t:SubscriptionId>JgBibjFwcjAzbWIyMDIubmFtcHJkMDMucHJvZC5vdXRsb29rLmNvbRAAAADwXxVesOnHS5BxUHKwAW88SHjwd1iB0Ag=</t:SubscriptionId>
</m:SubscriptionIds>
<m:ConnectionTimeout>30</m:ConnectionTimeout>
</m:GetStreamingEvents>
</soap:Body>
</soap:Envelope>
В следующем примере XML показано сообщение GetStreamingEventsResponse , которое отправляется с сервера клиенту в ответ на запрос операции GetStreamingEvents . Он содержит createdEvent и NewMailEvent для элемента, а также ModifiedEvent для папки, которые возникают при получении нового сообщения.
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<h:ServerVersionInfo MajorVersion="15"
MinorVersion="0"
MajorBuildNumber="785"
MinorBuildNumber="6"
Version="V2_6"
xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
</s:Header>
<soap:Body xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
<m:GetStreamingEventsResponse xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages">
<m:ResponseMessages>
<m:GetStreamingEventsResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:Notifications>
<m:Notification>
<t:SubscriptionId>JgBibjFwcjAzbWIyMDIubmFtcHJkMDMucHJvZC5vdXRsb29rLmNvbRAAAADwXxVesOnHS5BxUHKwAW88SHjwd1iB0Ag=</t:SubscriptionId>
<t:CreatedEvent>
<t:TimeStamp>2013-09-16T04:31:29Z</t:TimeStamp>
<t:ItemId Id="AAMkADkzNjJjODUzLWZhMDMtNDVkMS05ZDdjLWVmMDlkYjQ1Zjc4MwBGAAAAAABSSWVKrmGUTJE+MVIvofglBwDZGACZQpSgSpyNkexYe2b7AAAAAAENAADZGACZQpSgSpyNkexYe2b7AAANGFYwAAA=" ChangeKey="CQAAAA==" />
<t:ParentFolderId Id="AQMkADkzNjJjODUzLWZhMDMtNDVkMS05ZDdjLWVmMDlkYjQ1Zjc4MwAuAAADUkllSq5hlEyRPjFSL6H4JQEA2RgAmUKUoEqcjZHsWHtm+wAAAgENAAAA" ChangeKey="AQAAAA==" />
</t:CreatedEvent>
<t:NewMailEvent>
<t:TimeStamp>2013-09-16T04:31:29Z</t:TimeStamp>
<t:ItemId Id="AAMkADkzNjJjODUzLWZhMDMtNDVkMS05ZDdjLWVmMDlkYjQ1Zjc4MwBGAAAAAABSSWVKrmGUTJE+MVIvofglBwDZGACZQpSgSpyNkexYe2b7AAAAAAENAADZGACZQpSgSpyNkexYe2b7AAANGFYwAAA=" ChangeKey="CQAAAA==" />
<t:ParentFolderId Id="AQMkADkzNjJjODUzLWZhMDMtNDVkMS05ZDdjLWVmMDlkYjQ1Zjc4MwAuAAADUkllSq5hlEyRPjFSL6H4JQEA2RgAmUKUoEqcjZHsWHtm+wAAAgENAAAA" ChangeKey="AQAAAA==" />
</t:NewMailEvent>
<t:ModifiedEvent>
<t:TimeStamp>2013-09-16T04:31:29Z</t:TimeStamp>
<t:FolderId Id="AQMkADkzNjJjODUzLWZhMDMtNDVkMS05ZDdjLWVmMDlkYjQ1Zjc4MwAuAAADUkllSq5hlEyRPjFSL6H4JQEA2RgAmUKUoEqcjZHsWHtm+wAAAgENAAAA" ChangeKey="AQAAAA==" />
<t:ParentFolderId Id="AQMkADkzNjJjODUzLWZhMDMtNDVkMS05ZDdjLWVmMDlkYjQ1Zjc4MwAuAAADUkllSq5hlEyRPjFSL6H4JQEA2RgAmUKUoEqcjZHsWHtm+wAAAgEJAAAA" ChangeKey="AQAAAA==" />
<t:UnreadCount>1</t:UnreadCount>
</t:ModifiedEvent>
</m:Notification>
</m:Notifications>
</m:GetStreamingEventsResponseMessage>
</m:ResponseMessages>
</m:GetStreamingEventsResponse>
</soap:Body>
После получения событий от сервера следующим шагом является синхронизация этих изменений с сервером. Используйте операцию Отмена подписки , чтобы завершить подписку на сервере, когда подписка больше не нужна.
Дальнейшие действия
После получения уведомлений можно синхронизировать иерархию папок или содержимое измененной папки.
См. также
Подписки на уведомления, события почтовых ящиков и службы EWS в Exchange
Уведомления по запросу о событиях почтовых ящиков с помощью веб-служб Exchange в Exchange
Поддержание сходства между группой подписок и сервером почтовых ящиков в Exchange
Обработка ошибок, связанных с уведомлениями, в EWS в Exchange