2017-10-02 66 views
0

プロジェクトにコメントシステムがあり、別のページを表示でき、独自のコメントがあります。私は自動的にページ上の新しいコメントを取得するSqlDependencyとsignalRを使用しようとしている。 私の問題は、複数の人がSqlDependencyで開いている接続を持っている場合、sqlnotificationから呼び出された "onchange"イベントの数が増え始めることです。 onchangeの代わりに、一度呼び出されると、各ユーザーごとに複数回呼び出されます。 (彼らは同じコメントページが表示されていない場合であっても)私はほとんどすべての最も一般的な応答は、私はそれがこのように呼ばれていたときにイベントを解除する必要があるとされてここに検索使い果たしました :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(); 
     } 
    } 

これのdidnは、私のために何かを変えているようだから、これを防ぐ最善の方法が失われてしまった。

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を作成していたことです。したがって、2つのウィンドウが1つのページに対して開いていれば、通知が2回確認され、新しいものがあれば2回応答が送信されます。 Ajaxリクエストのため、これらのSqlDependenciesはすべて2倍になりましたので、次回は4回、その後は8回となります。

私が代わりにやったのは、本質的に私のページをsignalrを使ってプライベートチャットに変更し、SqlDependencyのものを捨ててしまったことです。だから、ユーザーがあるページに行くと、ページ上の他の人とつながっています。誰かが「コメント」を送信すると、そのページを閲覧している他の人にも送信されます。

関連する問題