使用 SignalR 服务在 Web 应用程序中启用自动更新

已完成

基于轮询的 Web 应用程序。

接下来,我们从轮询转换到一个(在发生数据更新时)将数据更新推送到已连接客户端的应用。 这种新设计通过仅在数据变化时进行更新,减少了流量并提高了 UI 的效率。 用于交付这个已更新解决方案的三种技术是 Azure Cosmos DB、Azure Functions 和 SignalR

  • Azure Cosmos DB:数据库中的数据发生更改时,Azure Cosmos DB 会公开一个更改源。 Azure Cosmos DB 中更改源支持的工作原理是侦听数据库容器中发生的更改。 然后,它会按照所更改文档的修改顺序输出这些文档的排序列表。 应用程序在侦听更改源时可以自动响应数据更改。

  • Azure Functions:此函数与原始 getStocks 函数的主要区别在于,此函数现在基于数据的更改触发。 在前面的练习中,我们基于来自客户端的请求触发了函数,并通过 Azure Cosmos DB 输入绑定拉回了所有数据。 使用 Azure Cosmos DB 触发器会自动提高我们的数据检索效率。 Azure Functions 具有一个绑定,它可以在 Azure Cosmos DB 更改源中更新数据时运行代码。 函数侦听更改源后,你可使用仅表示数据更改的数据子集。

  • Azure SignalR:此服务提供与从 Azure Functions 应用侦听 SignalR 广播的客户端上的 SignalR 连接的双向通信。

SignalR 和持久连接

与轮询相比,更有利的设计是客户端和服务器之间的持久连接。 通过建立持久连接,服务器可随时根据需要向客户端推送数据。 连接的按需特性可减少网络流量和服务器负载。 通过 SignalR,可轻松地将这种体系结构添加到应用程序中。

SignalR 是一系列技术的抽象,使应用可以实现客户端和服务器之间的双向通信。 SignalR 自动处理连接管理,让你可同时向所有连接的客户端广播消息,就像聊天室一样。 也可以向特定客户端发送消息。 客户端和服务器之间的连接是持久的,不同于传统的 HTTP 连接,后者针对每次通信重新建立。

SignalR 提供的抽象的一个主要优点是它支持“传输”回退的方式。 传输是客户端和服务器之间的通信方法。 SignalR 连接以标准的 HTTP 请求开始。 当服务器评估连接时,选择最合适的通信方法(传输)。 与客户端的持久连接配对后,该函数可按需联系各个客户端,这是实时应用程序体系结构的基础。 传输的选择取决于客户端上可用的 API:

  • HTML 5:对于支持 HTML 5 的客户端,默认使用 WebSockets API 传输。
  • WebSocket:如果客户端不支持 WebSockets,则 SignalR 回退到 Server Sent Events(也称为 EventSource)。
  • 其他技术:对于老客户端,使用 Ajax 长轮询或 Forever Frame(仅限 IE)来模拟双向连接。

SignalR 提供的抽象层为应用程序提供了两个优点。 第一个优点是让应用具有面向未来的可用性。 随着 Web 的发展和优于 WebSockets 的 API 的推出,应用程序并不需要更改。 可以更新到支持任何新 API 的 SignalR 版本,不需全面修改应用程序代码。

第二个优点是 SignalR 使应用程序可以正常降级,具体取决于客户端的受支持技术。 如果它不支持 WebSockets,则使用 Server Sent Events。 如果客户端无法处理 Server Sent Events,则它使用 Ajax 长轮询等。

让我们了解如何使用 SignalR 从读取 Azure Cosmos DB 更改源的函数中广播信息。