2016-08-17 75 views
0

我有一個asp.net mvc應用程序與vs2013和.net框架4.5.1應該通知用戶何時某個字段得到更新和某個recordID。 當我打開一個瀏覽器的單個實例時,一切正常,但是當我打開另一個選項卡或瀏覽器在同一臺機器上或在不同的計算機上時,它會多次觸發sqldepdencychange事件。signalr與sqldepdency爲每個瀏覽器實例發射多次

下面是我的樞紐代碼

public class MessagesHub : Hub 
    { 
     private static string conString = ConfigurationManager.ConnectionStrings["FleetLink_DB"].ToString(); 

     private static string hostName = ""; 


     public static void SendMessages(string hName) 
     { 
      IHubContext context = GlobalHost.ConnectionManager.GetHubContext<MessagesHub>(); 
      hostName = hName; 
      context.Clients.Group(hostName).updateMessages(hName); 
     } 

     public Task leaveGroup(string hName) 
     { 
      return Groups.Remove(Context.ConnectionId, hName); 
     } 

     public Task joinGroup(string hName) 
     { 
      return Groups.Add(Context.ConnectionId, hName); 
     } 
} 

下面是我的signalr腳本文件

$(function() { 
      var dialog, form 
      // Declare a proxy to reference the hub. 

      var notifications = $.connection.messagesHub; 
      //debugger; 
      //Create a function that the hub can call to broadcast messages. 
      notifications.client.updateMessages = function (hName) { 
       alert("testing"); 
       getoneMessages(hName) 
      }; 

      $.connection.hub.logging = true; 
      $.connection.hub.start().done(function() { 
       var hostName = getUrlVars()["System_Name"]; 
       notifications.server.joinGroup(hostName); 
      }).fail(function (e) { 
       alert(e); 
      }); 
     }); 

     function getUrlVars() { 
      var vars = [], hash; 
      var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&'); 
      for (var i = 0; i < hashes.length; i++) { 
       hash = hashes[i].split('='); 
       vars.push(hash[0]); 
       vars[hash[0]] = hash[1]; 
      } 
      return vars; 
     } 

     function getoneMessages(hName) { 
      var tbl = $('#selectable'); 
      //alert('mesgID=' + mesgID) 
      //var tbl = $('#selectable'); 
      $.ajax({ 
       url: '/controller/view', 
       cache: false, 
       contentType: 'application/html ; charset:utf-8', 
       type: 'GET', 
       dataType: 'html' 
      }).success(function (result) { 
       //alert(result); 
       tbl.empty().append(result); 
      }).error(function (exception) { 
       //alert('failed= ' + exception); 
      }); 
     } 

     window.onbeforeunload = function (e) { 
      var hostName = getUrlVars()["System_Name"]; 
      notifications.server.joinGroup(hostName); 
      $.connection.hub.stop(); 

     }; 

下面是我partialview代碼的定義RegisterForNotification和depdendency_onchange事件一起

public PartialViewResult SignalRTesterPartialView() 
{ 
/...COde not included for brevity..../ 
    RegisterForNotifications(ID); 
} 



public void RegisterForNotifications(int mID) 
     { 
      var efConnectionString = ConfigurationManager.ConnectionStrings["DB"].ConnectionString; 
      var builder = new EntityConnectionStringBuilder(efConnectionString); 
      var regularConnectionString = builder.ProviderConnectionString; 

      string commandText = null; 


      commandText = "select ID,Status,Name from tblABC where ID=" + strID; 

       using (SqlConnection connection = new SqlConnection(regularConnectionString)) 
       { 
        using (SqlCommand command = new SqlCommand(commandText, connection)) 
        { 
         connection.Open(); 

         var dependency = new SqlDependency(command); 
         dependency.OnChange += new OnChangeEventHandler(dependency_OnChange); 

         // NOTE: You have to execute the command, or the notification will never fire. 
         var reader = command.ExecuteReader(); 
        } 
       } 

     } 

     private void dependency_OnChange(object sender, SqlNotificationEventArgs e) 
     { 
      if (e.Type == SqlNotificationType.Change && e.Info== SqlNotificationInfo.Update) 
      { 
       MessagesHub.SendMessages(hName); 
      } 

      RegisterForNotifications(1012); 


     } 

不知道爲什麼它會用每個addit多次發送sendmessages我打開的離子瀏覽器實例。任何指針都會有幫助!

回答

1

刪除EventHandler當你用它

private void dependency_OnChange(object sender, SqlNotificationEventArgs e) 
{ 
    if (e.Type == SqlNotificationType.Change && e.Info== SqlNotificationInfo.Update) 
    { 
     MessagesHub.SendMessages(hName); 
    } 

    //remove event handler 
    SqlDependency dependency = sender as SqlDependency; 
    dependency.OnChange -= new OnChangeEventHandler(dependency_OnChange); 

    RegisterForNotifications(1012); 
} 
完成
相關問題