【问题标题】:SqlDependency / Service Broker in LocalDB, implementing Signal RLocalDB 中的 SqlDependency / Service Broker,实现 Signal R
【发布时间】:2016-07-02 01:11:32
【问题描述】:

我正在我的项目中实现 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 的任何链接或最新教程。

【问题讨论】:

  • 你能检查我的答案吗?我错过了什么吗?

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


【解决方案1】:

我将从第二个查询开始回答。首先您需要启用服务代理

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地址 var alertsHubProxy = connection.createHubProxy('MyHub')

//broadcast alert
alertsHubProxy.on('sendNotifications', function (item) {
    //do something here
});

关于您的第一个查询 - 在 2 台不同的机器上运行 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/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 2010-11-04
    • 2013-09-07
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多