我正在我的项目中实现SignalR,并希望在我的数据库中发生变化时在我的客户端发出实时通知。
我的项目中有3个组件
我编写了代码以启用我的(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
的任何链接或最新教程。
答案 0 :(得分:2)
我将从第二个查询开始回答。首先,您需要启用服务代理
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安装信号R 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 connection = $ .hubConnection(); connection.url =“http://localhost:40471/signalr”; // API URL var alertsHubProxy = 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/