2017-10-02 21 views
0

프로젝트에 다른 페이지를 볼 수 있고 자신의 의견이있는 의견 시스템이 있습니다. SqlDependency와 함께 signalR을 사용하여 페이지의 새로운 주석을 자동으로 가져 오려고합니다. 내 문제는 여러 사람이 SqlDependency로 열린 연결을 가지고있는 경우 sqlnotification에서 호출 된 "onchange"이벤트의 수가 곱해지기 시작한다는 것입니다. 한 번 호출되는 onchange 대신 각 사용자에 대해 여러 번 호출됩니다. (그들은 같은 의견 페이지를 볼 수없는 경우에도) I했습니다 거의 소진 모두 여기에 가장 일반적인 응답이 같이라고했을 때이 이벤트를 취소 할 필요가있는과 검색이 didn를SqlDependency OnChange 이벤트를 여러 번 실행하는 중

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

     if (e.Info.ToString().ToLower().Trim() == "insert") 
     { 
      MyHub.Show(); 
     } 
    } 

저를 위해 무엇이든 바뀌는 것 같아요. 그래서 제가 이것을 막는 최선의 방법이 무엇인지에 대해서는 분실했습니다.

GetData 메서드 :

[WebMethod] 
    public IEnumerable<DUpdates> GetData(string dnum, string date) 
    { 
     if (Common.IsValidInt32(dnum)) //just a function that check for valid int 
     { 
      using (var connection = 
       new SqlConnection(ConfigurationManager.ConnectionStrings["SConnectionString"].ConnectionString)) 
      { 

       connection.Open(); 

      using (SqlCommand command = new SqlCommand(@"SELECT [Comment] FROM dbo.DUpdates WHERE (DID = " + dnum + ") AND (Deleted = 0) AND CreateDate > @Date ORDER BY CreateDate DESC", connection)) 
      { 
       command.Parameters.Add("@Date", SqlDbType.DateTime); 
       command.Parameters["@Date"].Value = date; 

       command.Notification = null; 

       SqlDependency dependency = new SqlDependency(command); 

       dependency.OnChange += new OnChangeEventHandler(dependency_OnChange); 


       if (connection.State == ConnectionState.Closed) 
        connection.Open(); 

       using (var reader = command.ExecuteReader()) 
       { 
        return reader.Cast<IDataRecord>().Select(x => new DUpdates() 
        { 
         comment = x.GetString(0) 
        }).ToList(); 
       } 
      } 
     } 
    } 

JS 물건 : 필요한 경우

$(function() { 
     var job = $.connection.myHub; 

     job.client.displayStatus = function() { 
      getData(); 
     }; 

     $.connection.hub.start(); 
     getData(); 
    }); 

    function getData() { 
     var params = (new URL(document.location)).searchParams; 
     var id = params.get("id"); 
     var dt = $("#accessdate").val(); 

     $.ajax({ 
      url: 'dupdatesservice.asmx/GetData', 
      data: JSON.stringify({dnum: id, date: dt}), 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      type: "POST", 
      success: function (data) { 
       if (data.d.length > 0) { 
        $("#testdiv").prepend(data.d[0].comment); 
       } 
      } 
     }); 
    } 

다른 코드를 제공 할 수 있습니다.

답변

0

여기서 문제는 페이지 (또는 여러 창과 동일한 사용자)에 있던 각 사용자에 대해 새 SqlDependency를 만들었다는 것입니다. 따라서 두 개의 창이 열려 있으면 한 페이지에 대해 두 번 확인하고 두 번 응답을 보내십시오. 아약스 요청으로 인해 이제는 모든 SqlDependencies가 두 배가되어 다음에 4 개의 응답을 받았다가 8을받습니다.

내가 대신하기로 결정한 것은 기본적으로 신호기를 사용하여 개인 채팅으로 페이지를 변경하고 SqlDependency 항목을 버렸습니다. 이제 사용자가 한 페이지로 이동하면 페이지의 다른 사용자와 연결되고 누군가가 "의견"을 제출하면 언제든지 페이지를 보는 다른 사용자에게 전송됩니다.