SqlDependency OnChange 事件多次触发
SqlDependency OnChange event firing multiple times
我有一个项目的评论系统,您可以在其中查看不同的页面,他们有自己的评论。我正在尝试将 signalR 与 SqlDependency 结合使用以自动在页面上提取新评论。
我的问题是,如果多人使用 SqlDependency 打开连接,则从 sqlnotification 调用的 "onchange" 事件的数量开始成倍增加。而不是 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();
}
}
这对我来说似乎没有任何改变,所以我不知道防止这种情况发生的最佳方法是什么。
获取数据方法:
[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);
}
}
});
}
如果需要可以提供其他代码。
这里的问题是我正在为页面上的每个用户(或具有多个 windows 的同一用户)创建一个新的 SqlDependency。因此,如果一个页面有 2 windows 个打开,那么它将检查通知两次,如果有新内容则发送两次响应。由于 ajax 请求,现在所有这些 SqlDependencies 都加倍了,所以下次我会得到 4 个响应,然后是 8 个,依此类推。
我决定改为使用 signalr 将我的页面更改为私人聊天,并放弃 SqlDependency 内容。因此,现在如果用户转到一个页面,他们将与该页面上的其他任何人建立联系,并且只要有人提交 "comment",它也会发送给查看该页面的其他人。
我有一个项目的评论系统,您可以在其中查看不同的页面,他们有自己的评论。我正在尝试将 signalR 与 SqlDependency 结合使用以自动在页面上提取新评论。 我的问题是,如果多人使用 SqlDependency 打开连接,则从 sqlnotification 调用的 "onchange" 事件的数量开始成倍增加。而不是 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();
}
}
这对我来说似乎没有任何改变,所以我不知道防止这种情况发生的最佳方法是什么。
获取数据方法:
[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);
}
}
});
}
如果需要可以提供其他代码。
这里的问题是我正在为页面上的每个用户(或具有多个 windows 的同一用户)创建一个新的 SqlDependency。因此,如果一个页面有 2 windows 个打开,那么它将检查通知两次,如果有新内容则发送两次响应。由于 ajax 请求,现在所有这些 SqlDependencies 都加倍了,所以下次我会得到 4 个响应,然后是 8 个,依此类推。
我决定改为使用 signalr 将我的页面更改为私人聊天,并放弃 SqlDependency 内容。因此,现在如果用户转到一个页面,他们将与该页面上的其他任何人建立联系,并且只要有人提交 "comment",它也会发送给查看该页面的其他人。