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

已完成

基于轮询的 Web 应用程序。

接下来,我们将从轮询转向一个能够在数据更新发生时立即推送到连接客户端的应用。 这种新设计通过仅随着数据更改进行更新来减少流量,并提高 UI 的效率。 我们用于交付此更新解决方案的三种技术是 Azure Cosmos DBAzure FunctionsSignalR

  • 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:此服务提供双向通信,客户端通过 SignalR 连接侦听来自 Azure Functions 应用的 SignalR 广播。

SignalR 和持久连接

与轮询相比,更有利的设计是保持客户端和服务器之间的持久连接。 建立持久连接允许服务器将数据推送到客户端。 连接的按需性质可减少服务器上的网络流量和负载。 SignalR 允许你轻松地将这种类型的体系结构添加到应用程序。

SignalR 是一系列技术的抽象,允许应用在客户端和服务器之间享受双向通信。 SignalR 会自动处理连接管理,并允许同时将消息广播到所有连接的客户端,例如聊天室。 还可以将消息发送到特定客户端。 客户端和服务器之间的连接是永久性的,与经典 HTTP 连接不同,该连接为每个通信重新建立。

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

  • HTML 5:对于支持 HTML 5 的客户端,默认情况下使用 WebSocket API 传输。
  • WebSocket:如果客户端不支持 WebSocket,则 SignalR 会回退到服务器发送事件(也称为 EventSource)。
  • 其他技术:对于老客户端,使用 Ajax 长轮询或 Forever Frame(仅限 Internet Explorer)来模拟双向连接。

SignalR 提供的抽象层为应用程序提供了两个优势。 第一个优点是让你的应用具有未来适应性。 随着 Web 的发展和 API 优于 WebSocket,应用程序不需要更改。 可以更新到支持任何新 API 的 SignalR 版本,无需彻底修改应用程序代码。

第二个好处是 SignalR 允许应用程序根据客户端支持的技术正常降级。 如果它不支持 WebSockets,则使用 Server Sent Events。 如果客户端无法处理 Server Sent Events,则它使用 Ajax 长轮询等。

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