来自SignalR客户端的多个呼叫

时间:2015-06-10 08:28:27

标签: c# asp.net-mvc signalr

在我的asp.net mvc应用程序上,我使用signalR通知db对应用程序的更改。我的问题是一旦我重新加载页面。 signalR客户端被多次调用。

我使用SqlDependency来获取sql db更改我的代码,如下所示

public List<Load> GetAllReportSignalR()
{
    var loads = new List<Load>();
    var connectionString = _context.Database.Connection.ConnectionString;
    using (var connection = new SqlConnection(connectionString))
    {
        connection.Open();
        using (SqlCommand command = new SqlCommand(@"SELECT LoadId, [FileName], LoadTypeId, CreatedDate, CreatedBy, LoadStatusId FROM [dbo].[Load]", connection))
        {
            command.Notification = null;
            var dependency = new SqlDependency(command);
            dependency.OnChange +=new OnChangeEventHandler(dependency_OnChange);
            if (connection.State == ConnectionState.Closed)
                connection.Open();
            var reader = command.ExecuteReader();
            while (reader.Read())
            {
                loads.Add(
                        new Load
                        {
                            FileName = (string)reader["FileName"],
                            CreatedBy = (string)reader["CreatedBy"],
                            CreatedDate = (DateTime)reader["CreatedDate"],
                            LoadId = (int)reader["LoadId"],
                            LoadStatusId = (int)reader["LoadStatusId"],
                            LoadTypeId = (short)reader["LoadTypeId"]
                        });
            }
        }

    }
    return loads;
}


private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
{

    if (e.Type == SqlNotificationType.Change)
    {
        Notifier.UpdateDataTable();
    }

}

在我的中心

[HubMethodName("updateDataTable")]
public void UpdateDataTable()
{
    IHubContext context = GlobalHost.ConnectionManager.GetHubContext<Notifier>();
    context.Clients.All.updateData();
}

然后我打电话给signalR客户端

   var notifier = $.connection.notifier;
notifier.client.updateData = function () {
    $.ajax({
        type: 'POST',
        url: '/Home/LoadData',
        success: function (d) {
            reloadTbl(d)
        }
    });
};

$.connection.hub.start().done(function () {
    $.ajax({
        type: 'POST',
        url: '/Home/LoadData',
        success: function (d) {
            reloadTbl(d)
        }
    });
}).fail(function(e) {

});

我在SqlDependencyApplication_Start()

上启动并停止Application_End()

我确实按照以下示例进行了操作,并且遇到了同样的问题(CodeProject Tutorial

1 个答案:

答案 0 :(得分:-1)

当你的页面加载时,你做了

$.connection.hub.start().done(function () {
    $.ajax({
        type: 'POST',
        url: '/Home/LoadData',
        success: function (d) {
            reloadTbl(d)
        }
    });
})

回调服务器加载数据。

另外,你有

var dependency = new SqlDependency(command);
dependency.OnChange +=new OnChangeEventHandler(dependency_OnChange);
private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
{

    if (e.Type == SqlNotificationType.Change)
    {
        Notifier.UpdateDataTable();
    }

}

注册数据已更改。对于上面的回调,它会触发 dependency_OnChange ,然后回调到客户端。

因此,您的网页已刷新两次。一个来自服务器推送,另一个来自客户端。

<强>解决方案:  您可以选择在加载页面时从服务器推送到客户端并删除客户端提取代码。