2015-06-10 5 views
0

в моем приложении mpc asp.net Я использую signalR для уведомления изменений db в приложении. моя проблема заключается в том, чтобы перезагрузить страницу. клиент 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) { 

}); 

я начал и остановился SqlDependency на Application_Start() и Application_End()

я сделал следовать ниже примеру, и имеет те же проблемы (CodeProject Tutorial)

+0

Я думаю, нам нужно немного больше кода, чтобы понять, почему его вызывают дважды. IE большая часть кода Javascript – Luke

+0

привет обновленный код с полным кодом. и на стороне клиента это код, который я использую. – Gayan

+0

Игнорируйте этот последний комментарий, я просто посмотрел код на этой странице, и он такой же, как ваш. – Luke

ответ

-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, который затем переводится на клиентскую сторону.

Следовательно, ваша страница была обновлена ​​дважды. Один из них был нажат на сервер, а другой - с клиентом.

Решение: Вы можете нажать кнопку с сервера на клиент, когда страница будет загружена, и удалить код клиента.

+0

Привет, Тоан, я удалил вызов ajax с момента запуска концентратора signalR и загрузился на страницу отдельно, но проблема все еще там, получая несколько вызовов – Gayan

+0

Привет, Гаян, я предлагаю вам установить точку останова внутри метода UpdateDataTable() и посмотреть на stacktrace, после чего вы узнаете, почему существует несколько вызовов клиентам. –

+0

я сделал. но не знаю, как это исправить, можете ли вы отправить некоторые образцы кода, пожалуйста? – Gayan