[英]Multiple Calls from SignalR client
在我的asp.net mvc應用程序上,我正在使用signalR通知數據庫對應用程序的更改。 我的問題是,一旦我重新加載頁面。 signalR客戶端被多次調用。
我使用SqlDependency
獲取SQL數據庫更改我的代碼如下
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) {
});
我在Application_Start()
和Application_End()
上啟動和停止了SqlDependency
我確實按照以下示例進行操作,並且存在相同的問題( CodeProject教程 )
加載頁面后,您做了
$.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 ,然后將其回調回客戶端。
因此,您的頁面刷新了兩次。 一個來自服務器,另一個來自客戶端。
解決方案:您可以選擇在頁面加載時從服務器推送到客戶端,並刪除客戶端請求代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.