gpt4 book ai didi

sql-server - LocalDB 中的 SqlDependency/Service Broker,实现 Signal R

转载 作者:行者123 更新时间:2023-12-03 03:43:09 25 4
gpt4 key购买 nike

我正在我的项目中实现 SignalR,并希望当我的数据库中发生更改时在我的客户端中收到实时通知。

我的项目中有 3 个组件

  1. 数据库
  2. Web API 服务
  3. WPF 客户端

我编写的代码是为了启用 (2) Web API 服务和 (3) WPF 客户端通信。

我关心的是我的 (1) 数据库和 (2) Web API 服务的实时通知。阅读了一些有关如何执行此操作的教程后https://gkulshrestha.wordpress.com/2014/05/02/signalr-with-sql-server-query-notification/

我的问题

  1. 我目前正在使用 LocalDB 进行开发,经过搜索,本地数据库未启用远程队列 ( Service Broker Or SqlDependency in SqlLocalDb? )。这是否意味着我的 (1) 数据库和 (2) Web api 服务不能位于不同的计算机上?开发完成后,我将在不同的机器上运行我的数据库和 Web api。

  2. 当我的数据库发生更改时,我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com