Exchange 中的通知订阅、邮箱事件和 EWS
查找更多关于在 Exchange中的 EWS 中的通知订阅和邮箱时间的信息。
你可以使用 EWS 托管 API 和Exchange Web 服务 (EWS) 订阅,以便当邮箱或邮箱中的一个或多个文件夹中的事件发生时接收通知。 这些订阅类型可用:流式通知、拉取通知和推送通知。 每个订阅类型使用不同的技术收取或检索通知。
获取通知 - 我有哪些选择?
EWS 包含三种订阅类型,它们可以独立工作,通知服务器上的客户端任何发生的改变。 不管你选择哪种订阅,你将可以访问所有相同的通知事件 - 不同的只是你获取它们的方式。
表 1. 订阅类型
选项 | 说明 | 它适合我吗? |
---|---|---|
流式通知 |
通过连接由服务器发送的通知,该连接在特定时间内保持开放。 |
流式通知一般适合大多数应用程序。 它们类似于拉取和推送通知,并结合了这两种的优点。 在你确定了通知订阅后,连接将会保持开放 30 分钟,以允许服务器向客户端推送通知。 不像拉取订阅那样需要请求更新,也不需要像推送订阅那样创建 Web 服务侦听器应用。 |
拉取通知 |
由客户端请求(拉)的通知。 |
拉取通知一般来说适用于大多数松散的客户端,即它们并没有持续地连接到网络。 拉取通知可能在客户端和服务器之间创造过多的流量,因为客户端会向服务器频繁地请求检索通知,且不是所有请求都能取回通知。 |
推送通知 |
由服务器通过回拨地址向客户端 Web 服务发送的通知。 |
一般来说,推送通知比拉取通知延迟较小,且适合重度用户,即有稳定访问权限且 IP 可查址的用户。 但是,自从流式通知于 2010 年来到 Exchange 后,推送通知就失去了宠爱。 如果可能的话,我们建议你以后使用流式通知而不是推送通知。 推送通知要求你写一个侦听器应用,也就是通知被推到的地方。 与拉取通知相比,这有一个小的好处,就是它可以减少线路流量,但是由于要求额外的应用,它也增加了开销。 |
我可以订阅什么 EWS 事件?
客户端订阅的 EWS 事件类型由 EWS 托管 API 的 EventType 枚举或 EWS 的 EventType元素定义。 以下 EWS 事件可订阅:
NewMail - 新邮件抵达收件箱。
Deleted - 邮件从收件箱中硬删除。 了解更多关于删除项通知,请参阅在 Exchange 中使用 EWS 删除项 以及 在 Exchange 中与 EWS 删除相关的邮箱事件拉取通知。
Modified - 项或文件夹有更改。
Moved - 项或文件夹移动。
Copied - 项或文件夹被复制。
Created - 项或文件夹被创建。
FreeBusyChanged - 用户的空闲忙碌信息更改。
另一个 EWS 事件类型,状态事件,由 EventType 元素定义,但你无需订阅此事件。 状态事件仅在流式和推送通知中由服务器发送,以检查客户端的状态。 用户需要响应此事件或用户超时。
单一用户操作经常导致多个通知的建立。 为阐释这一点,下文的图显示了一些常见的应用场景以及每个场景中创建的通知。 用户设置对所收通知有影响,所以此列表不能穷尽所有配置选项和最终通知。
图 1. 通知订阅返回的事件类型
图 1 简化了通知过程。 现实中,多个通知(甚至是多个同类型的通知)可以由单一用户操作创建。 比如,在文件夹移动操作的情况中,三个文件夹事件被创建:一个关于文件夹修改,一个关于旧文件夹,还有一个关于新文件夹。 因为单一操作可以出现多个事件,我们建议你构建一个几秒长的等待事件到你的同步操作中,这样同步只有在操作完成时才会进行,而不是在操作中多次进行。
另外很重要的是,每个用户选择的配置设置会影响最终创建的通知。 比如,一些用户的空闲忙碌数据是自动更新的,当收到新的会议请求时 FreeBusyChanged 事件就会被创建,这甚至早于他们阅读此请求的时间。 对于其他用户来说,空闲忙碌时间、FreeBusyChanged 事件在他们接受会议请求之前都不会更新或创建。 这些设置可能会对服务器创建的通知产生极大的影响。
EWS 通知的原理是什么?
EWS 通知以订阅的形式进行。 通常,每个邮箱一个订阅,在邮箱订阅内你还可以订阅一些或所有文件夹。 你可以决定订阅什么种类的通知(流式、拉取、推送)以及接收什么种类的事件(NewMail、Created、Deleted、Modified等),然后可以创建订阅。 然后 EWS 事件会非同步地从邮箱服务器发送到客户端。 (历史经验:事件在 Exchange 2007 上是同步的 - 事件在 Exchange 2010 存储在 Client Access 服务器上,但现在已经不是了!)
取决于你的订阅类型,通知发送到客户端的方式不一。 本节介绍了每种订阅类型的具体工作原理。
EWS 流式通知
流式通知依赖于一个在服务器挂起的 get 请求来保持流式订阅连接打开,这样任何在连接活动时发生的事件都会马上流给客户端。 多个通知可以在单个连接周期内发送,在至多 30 分钟的间隔期过期前,连接都会保持打开。 连接过期后,客户端再次发送 get 请求。 图 2 显示了流式订阅和流式通知工作的原理。
图 2. 流式处理通知概述
更多关于创建流式通知的信息,请参阅在 Exchange 上使用 EWS 时关于邮箱事件的流式通知。
EWS 拉取通知
拉取通知依靠客户端以一定间隔请求客户端管理的通知。 这可能会在获得 GetEvents 响应时未收到通知。 图 3 显示了拉取订阅和拉取通知工作的原理。
图 3. 拉取通知概述
更多关于创建拉取通知的信息,请参阅在 Exchange 上使用 EWS 时关于邮箱事件的拉取通知。
EWS 推送通知
推送通知依靠服务区将通知推回到客户端。 只有在有通知时才会有流量。 图 4 显示了推送订阅和推送通知工作的原理。
图 4. 推送通知概述
如果你在使用 Exchange 2010 和推送通知,请考虑升级你的应用使用流式通知,这样你就不用一个额外的应用程序来收取事件了。
我如何订阅通知?
取决于你想要创建的订阅类型,你有一些订阅通知的选项。
表 2. 用于订阅通知的操作和方法
如何获取 EWS 事件?
创建订阅后,实际事件发送到客户端的方式取决于订阅类型。
对于流式通知而言,流式订阅连接必须创建,然后订阅会加到连接上。 你可以在在 Exchange 上使用 EWS 时关于邮箱事件的流式通知中了解更多有关此过程的信息。
对于推送通知而言,订阅对象在订阅创建时初始化,这样你只需调用 GetEvent 方法或操作来从服务器检索事件。 你可以在在 Exchange 上使用 EWS 时关于邮箱事件的推送通知中了解更多有关信息。
接下来的表列出了检索事件所需的操作和类。
表 3. 用于创建连接和获取事件的元素和类
订阅类型 | EWS 操作 | EWS 托管 API 方法 | 功能 |
---|---|---|---|
流式 |
GetStreamingEvents 操作 |
StreamingSubscriptionConnection.AddSubscription 方法 |
在服务器上创建一个挂起的 get 请求,当事件发生时,该请求会被响应。 |
拉取 |
GetEvents 操作 |
PullSubscription.GetEvents 方法 |
从服务器获取拉取通知事件。 |
推送 |
不适用。 |
不适用。 |
推送通知自动发送到 Web 服务倾听器(订阅请求中指定的回拨 URL)。 无额外的方法或操作需要被调用。 |
我如何取消订阅通知?
下列表格列出了你取消退订每一种订阅的方法。
表 4. 取消订阅通知的操作和方法
或者,你可以让每个订阅超时。
表 5. 订阅超时
订阅类型 | EWS 中的超时值 | EWS 托管 API 中的超时值 | 处理超时 |
---|---|---|---|
流式 |
ConnectionTimeout 元素 |
StreamingSubscriptionConnection 构造函数的 lifetime 参数 |
对于 EWS 托管 API,超时值走完后,会引发 OnDisconnect 事件。 如果 StreamingSubscriptionConnection.Open 方法未被调用,连接将关闭。 对于 EWS,超时值走完后,GetUserConfigurationResponse 消息会返回一个 ConnectionStatus的关闭值。 |
拉取 |
超时元素 |
SubscribeToPullNotification 方法的 timeout 参数 |
超时值走完后,服务器会删除订阅。 |
推送 |
StatusFrequency 元素 |
SubscribeToPushNotification 方法的 frequency 参数 |
如果服务器没有收到对推送通知或状态 ping 的响应,它会重新尝试发送通知几次,然后才停止发送通知。 有关详细信息,请参阅StatusFrequency |
我可以限制订阅吗?
在本地部署中,你可以用EwsMaxSubscriptions 限制参数限制每个用户的订阅数量限制。 该策略可以应用到全部用户或仅具体用户。 EwsMaxSubscriptions 限制策略对 Exchange Online 不可配置。
本节内容
- 在 Exchange 上使用 EWS 时关于邮箱事件的流式通知
- 在 Exchange 上使用 EWS 时关于邮箱事件的拉取通知
- 在 Exchange 中保持一组订阅和邮箱服务器之间的相关性
- 在 Exchange 中使用 EWS 时处理通知相关的错误