SqlDependency OnChange事件多次触发

时间:2017-10-02 22:36:00

标签: c# asp.net ajax signalr sqldependency

我在项目上有一个评论系统,您可以在其中查看不同的页面并且他们有自己的评论。我试图使用带有SqlDependency的signalR来自动在页面上提取新的评论。      我的问题是,如果有多个人使用SqlDependency打开连接,那么" onchange"从sqlnotification开始调用的事件越来越多。一旦为每个用户多次调用,它就会被调用而不是onchange。 (即使他们没有查看相同的评论页面)      我在这里搜索时已经非常疲惫,最常见的回答是我需要取消订阅此事件,如下所示:

find . -name 'BkupFPTCONS*' -mtime -1 \
    -execdir tar -xf {} -C ./FPTCRPOL --strip-components=1 \; -delete 

这对我来说似乎没有任何改变,所以我迷失了防止这种情况的最佳方法。

GetData方法:

    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();
        }
    }

JS的东西:

    [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();
                }
            }
        }
    }

如果需要,可以提供其他代码。

1 个答案:

答案 0 :(得分:0)

这里的问题是我正在为页面上的每个用户(或具有多个窗口的同一用户)创建新的SqlDependency。因此,如果一个页面打开了2个窗口,那么它将检查两次通知,如果有新内容则发送两次响应。由于ajax请求,现在所有这些SqlDependencies都加倍了,所以下次我得到4个响应,然后8个,依此类推。

我决定做的是基本上使用signalr将我的页面改为私人聊天,然后抛弃了SqlDependency的东西。所以,现在如果用户转到一个页面,他们就会与页面上的任何其他人联系,并且只要有人提交了&#34;评论&#34;它也会被发送给查看该页面的其他人。