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

标签 sql-server asp.net-web-api signalr service-broker sqldependency

我正在我的项目中实现 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/

相关文章:

sql-server - 以其他语言显示月份名称

sql - 选择仅与另一个表中的记录相关联的记录

sql-server - sp_msforeachdb 发生错误时需要捕获数据库名称

c# - autofac 是否支持新的 Web Api 2

ssl - 使用自签名证书时建立 SignalR 连接

c# - SignalR:检测 C# 客户端中的事件连接

SQL Server - 停止或中断 SQL 脚本的执行

c# - .net core 中的 Web API 请求查询参数值为空

Azure、SignalR 和 Web Api 不向客户端发送消息

c# - 使用 IdentityDbContext 对 Entity Framework 6 进行单元测试