我正在我的项目中实现 SignalR,并希望当我的数据库中发生更改时在我的客户端中收到实时通知。
我的项目中有 3 个组件
- 数据库
- Web API 服务
- WPF 客户端
我编写的代码是为了启用 (2) Web API 服务和 (3) WPF 客户端通信。
我关心的是我的 (1) 数据库和 (2) Web API 服务的实时通知。阅读了一些有关如何执行此操作的教程后https://gkulshrestha.wordpress.com/2014/05/02/signalr-with-sql-server-query-notification/
我的问题
我目前正在使用 LocalDB 进行开发,经过搜索,本地数据库未启用远程队列 ( Service Broker Or SqlDependency in SqlLocalDb? )。这是否意味着我的 (1) 数据库和 (2) Web api 服务不能位于不同的计算机上?开发完成后,我将在不同的机器上运行我的数据库和 Web api。
当我的数据库发生更改时,我的 Web API 如何收到通知?也许,服务代理是否向监听客户端(我的 Web API 服务)广播事件?
欢迎提供有关 SignalR 的 SqlDependency
的任何链接或最新教程。
最佳答案
我将从第二个查询开始回答。首先您需要启用服务代理
SELECT [name], [service_broker_guid], [is_broker_enabled] FROM [master].[sys].[databases]
在输出中检查is_broker_enabled列是否设置为1,如果没有运行下面的查询(更改数据库名称)
ALTER DATABASE sampleNotifications SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE ;
将必要的表添加到您要监视的数据库中。在您的 webAPI 的 web.config 中添加此数据库的连接字符串
在你的 webAPI 中安装 signalR nuget 安装包 Microsoft.AspNet.SignalR
创建一个hubs文件夹并添加一个signalR hub类并且可以有基本的onConnected方法
public override Task OnConnected()
{
//you can log the connection ID.
return base.OnConnected();
}
在global.asax.cs或startup.cs中注册signalR
RouteTable.Routes.MapHubs(); //for global.asax.cs and will work only for signalR 1.1. From 2.0 onwards you need to have startup class
或
app.MapSignalR(); //startup.cs
现在最重要的部分是启动 SQLDependency 类并处理更改事件。重要的部分是您需要定义您正在监视的内容,如下所示,我在 global.asax.cs 中添加了一个用于监视的简单方法SampleNotifications DB 的 TestNotifications 表
private void RegisterSQLNotifications()
{
string connectionString = ConfigurationManager.ConnectionStrings["sampleNotifications"].ConnectionString;
SqlDependency.Start(connectionString);
string commandText = @"Select * from dbo.TestNotifications";
using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlCommand command = new SqlCommand(commandText, connection))
{
connection.Open();
var sqlDependency = new SqlDependency(command);
sqlDependency.OnChange += sqlDependency_OnChange;
// NOTE: You have to execute the command, or the notification will never fire.
using (SqlDataReader reader = command.ExecuteReader())
{
}
}
}
}
void sqlDependency_OnChange(object sender, SqlNotificationEventArgs e)
{
if (e.Info == SqlNotificationInfo.Insert)
{
//This is how signalrHub can be accessed outside the SignalR Hub MyHub.cs file
// you can add your business logic here, like what exactly needs to be broadcasted
var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
context.Clients.All.sendNotifications();
}
//Call the RegisterSQLNotifications method again
RegisterSQLNotifications();
}
在global.asax.cs的Application_Start中调用RegisterSQLNotifications。现在,只要表中有插入,sqlDependency_OnChange 事件就会被触发,您可以广播到相应的客户端
在客户端的 HTML 页面上添加以下内容。您可以针对您的 WPF 项目进行相应的修改。
var 连接 = $.hubConnection();
连接.url =“http://localhost:40471/signalr”;//API地址
varalertsHubProxy = connection.createHubProxy('MyHub')
//broadcast alert
alertsHubProxy.on('sendNotifications', function (item) {
//do something here
});
关于你的第一个查询 - 在两台不同的机器上运行 webAPI 和数据库应该没问题。请参阅使用多个 IIS 实例的横向扩展示例
http://www.asp.net/signalr/overview/performance/scaleout-with-sql-server
几个最接近的链接 http://techbrij.com/database-change-notifications-asp-net-signalr-sqldependency
http://www.codeproject.com/Articles/883702/Real-Time-Notifications-using-SignalR-and-SQL-Depe
http://venkatbaggu.com/signalr-database-update-notifications-asp-net-mvc-usiing-sql-dependency/
关于sql-server - LocalDB 中的 SqlDependency/Service Broker,实现 Signal R,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38155572/