【问题标题】:SqlDependency OnChange event firing multiple timesSqlDependency OnChange 事件多次触发
【发布时间】:2017-10-02 22:36:00
【问题描述】:

我有一个项目的评论系统,您可以在其中查看不同的页面,并且它们有自己的 cmets。我正在尝试将 signalR 与 SqlDependency 一起使用来自动在页面上拉取新的 cmets。 我的问题是,如果多个人使用 SqlDependency 打开连接,则从 sqlnotification 调用的“onchange”事件的数量开始成倍增加。而不是 onchange 甚至被调用一次,它将为每个用户多次调用。 (即使他们查看的不是同一个 cmets 页面) 我在这里几乎用尽了所有搜索,最常见的响应是当它被这样调用时我需要取消订阅该事件:

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

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

【问题讨论】:

    标签: c# asp.net ajax signalr sqldependency


    【解决方案1】:

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

    我决定改为使用信号器将我的页面更改为私人聊天,并放弃 SqlDependency 的东西。因此,现在如果用户转到一个页面,他们会与页面上的其他任何人建立联系,并且无论何时有人提交“评论”,它也会发送给查看该页面的其他人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-01
      • 2021-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多