65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 SignalR 进行实时数据更新

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.33/5 (5投票s)

2015年3月23日

CPOL

5分钟阅读

viewsIcon

40417

使用 SignalR 进行实时数据更新

在我的上一篇文章中,我们讨论了SignalR的概念以及如何使用它来创建一个简单的基于Web的群聊。文章包含了大量关于SignalR如何工作以及为什么它是创建实时应用程序的良好候选者的解释。我们不会再次详细介绍,在开始之前,我建议您阅读我的上一篇文章这里。本讨论将是我们上一篇文章中所学知识的另一个实际应用。

让我们创建一个另一个示例应用程序来理解SignalR的用途。此应用程序将是一个HTML页面,它显示数据库中的一些数据。在这个示例的后端,我们将有另一个应用程序,例如任何表单、Windows服务或RSS Feed,它将新数据插入到数据库中。一旦新数据添加到数据库中,它就会反映在这个HTML页面上。

在我们开始讨论之前,一个重要的点是,这个示例不仅会使用SignalR,还会使用SqlDependency的概念,这样我们的服务器中心就可以收到数据库中任何更改的通知,并将最新数据广播给用户。简要描述一下逻辑,我们的中心将订阅SqlServer的数据库中任何数据更改,收到通知后,获取最新数据并将其广播到HTML页面。因此,我们的应用程序将包含以下3个独立组件。

  • 名为Users的示例表,位于启用了ServiceBroker的SQL数据库中。
  • 一个带有HTML页面的应用程序,用于显示数据库中的用户列表。此应用程序还将包含
    1. 一个接收来自第三方应用程序的数据并将其保存到数据库的Web API。
    2. 一个SignalR组件,用于将最新数据广播给用户。
  • 一个带有HTML页面的应用程序,通过调用Web API向数据库提交新数据。

因此,我们的整体应用程序流程如下所示

数据库设置

在一个示例数据库中创建一个名为Users的新表。为了使用SqlDependency,我们需要为数据库启用ServiceBroker。这可以通过使用以下命令来完成

ALTER DATABASE Database_Name SET ENABLE_BROKER

或者,通过UI选择数据库,右键单击其属性,转到“选项”,导航到“Service Broker”部分,并将“Broker Enabled”属性的值更改为True

创建主应用程序

此应用程序将包含以下组件

  1. Web API,用于接收来自数据馈送应用程序的数据并将其保存到数据库。
  2. 一个HTML页面,用于显示数据库中的数据。
  3. SignalR组件,一旦新数据添加到数据库中,它就会使用最新数据刷新HTML页面。

让我们创建一个Web API,它可以接收来自用户的数据并将其存储在数据库中。为此,我们使用NuGet包管理器添加对WebApi2和OWIN包的引用。添加引用后,我们添加一个类型为Web API Controller类的新类文件。让我们将其命名为DataFeedController.cs。添加一个POST方法来接收来自用户的数据并使用实体框架将其存储在数据库中。因此,我们的控制器将如下所示

现在,为了托管Web APISignalR,我们添加一个名为Startup.cs的文件,并为Web API添加路由模板,并将Web APISignalR都注册到OWIN管道。当我们启动应用程序时,它将导致在后端托管Web API

现在,为了向应用程序添加实时功能,我们添加一个名为RealtimeDataHub.cs的类,该类派生自Hub类,并将用作数据库和HTML页面(用于显示数据)之间的中间件。此类将有一个名为GetUsers()的方法,该方法将从数据库获取数据并将其广播给已连接的用户。在此方法内部,中心还订阅SQL以获取数据库更改的通知,使用SqlDependency类的OnDependency更改事件。请参见下面的代码

创建数据馈送应用程序

创建一个新的空项目并向其中添加一个HTML页面。此HTML页面将有3个文本框和一个按钮,用于通过调用步骤1中创建的Web API将数据存储到数据库中。我们将称之为数据馈送应用程序。在实时场景中,我们可以使用任何Windows服务,该服务使用某些API获取数据并将其存储到数据库中。因此,我们的HTML标记将如下所示

接下来,使用Ajax调用将数据发送到Web API控制器,该控制器将其存储在数据库中。

请注意,这里我们使用了localhost url来引用托管Web API的位置。您可以将其替换为Web API位置的实际url。

因此,我们的设置现在已完成。为了启动应用程序,首先运行主应用程序的HTML页面,该页面显示数据库中的数据。启动此应用程序时,其相应的Web API也会被托管。第一次,将没有数据。因此,让我们也启动数据馈送应用程序并添加一些数据。添加新数据并保存。一旦添加了新数据,它就会立即反映在主应用程序的主页中。见下文

因此,无需使用基于计时器的调用。使用SignalR功能并创建实时应用程序。希望您喜欢阅读它。快乐编码!!!

© . All rights reserved.