LocalDB中的SqlDependency / Service Broker,实现Signal R.

时间:2016-07-02 01:11:32

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

我正在我的项目中实现SignalR,并希望在我的数据库中发生变化时在我的客户端发出实时通知。

我的项目中有3个组件

  1. 数据库
  2. Web API服务
  3. WPF客户端
  4. 我编写了代码以启用我的(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服务)?

    3. 欢迎使用SignalR提供有关SqlDependency的任何链接或最新教程。

1 个答案:

答案 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/