在本文中,将探讨如何利用SignalR技术创建一个实时更新的Web应用。SignalR是一个库,它允许开发者在服务器端代码和客户端之间建立持久的连接,从而实现实时数据的推送。将不会重复SignalR的工作原理,而是直接进入一个实际的应用案例。
将创建一个示例应用程序,该程序将通过HTML页面展示数据库中的数据。在示例的后端,将有一个应用程序,它可以是任何形式的应用程序、Windows服务或RSS源,负责将新数据插入数据库。一旦新数据被添加到数据库中,它将立即在HTML页面上反映出来。
在开始讨论之前,需要指出的是,这个例子不仅会使用SignalR,还会使用SqlDependency的概念,以便服务器中心能够接收到数据库中任何数据变化的通知,并将最新数据广播给用户。简单来说,中心将订阅SQL Server,以便在数据库数据发生变化时得到通知,获取最新数据并广播到HTML页面。因此,应用程序将由以下三个独立的组件组成:
创建一个名为“Users”的示例表,在数据库中启用其ServiceBroker。为了使用SqlDependency,需要启用数据库的ServiceBroker。这可以通过以下命令完成:
ALTER DATABASE Database_Name SET ENABLE_BROKER;
或者,通过UI进行操作:选择数据库,右键单击其属性,转到选项,导航到Service Broker部分,并将Broker Enabled属性的值更改为True。
这个应用程序将包括以下组件:
首先,创建一个Webapi,它可以从用户那里接收数据并将其存储在数据库中。为此,使用NuGet包管理器添加对WebApi2和OWIN包的引用。引用添加后,添加一个新的类文件,类型为Web APIController类。将其命名为DataFeedController.cs,并添加一个POST方法来接收用户的数据并使用实体框架将其存储在数据库中。
为了托管Webapi和SignalR,添加一个名为Startup.cs的文件,并为Webapi添加路由模板,同时将webapi和SignalR注册到OWIN管道中。启动应用程序时,它将在后端托管Webapi。
为了给应用程序添加实时功能,添加一个名为RealtimeDataHub.cs的类,该类派生自Hub类,用作数据库和用于显示数据的HTML页面(用户连接)之间的中间件。这个类将有一个名为GetUsers()的方法,该方法从数据库获取数据并将其广播给连接的用户。在这个方法中,中心还订阅SQL以获取数据库中数据变化的通知,使用SqlDependency类的OnDependencyChange事件。以下是代码示例:
创建一个新的空项目,并添加一个HTML页面。这个HTML页面将有3个文本框和一个按钮,用于通过调用步骤1中创建的WebApi将数据存储在数据库中。将称之为数据源应用程序。在实时场景中,可以有一个Windows服务,它使用某个API获取数据并将其存储在数据库中。因此,HTML标记将如下所示:
接下来,使用Ajax调用将数据发送到webapi控制器,该控制器将其存储在数据库中。注意,这里使用了localhost URL来引用web API的托管位置。可以用WebApi的实际URL替换它。