我在项目上有一个评论系统,您可以在其中查看不同的页面并且他们有自己的评论。我试图使用带有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();
}
}
}
}
如果需要,可以提供其他代码。
答案 0 :(得分:0)
这里的问题是我正在为页面上的每个用户(或具有多个窗口的同一用户)创建新的SqlDependency。因此,如果一个页面打开了2个窗口,那么它将检查两次通知,如果有新内容则发送两次响应。由于ajax请求,现在所有这些SqlDependencies都加倍了,所以下次我得到4个响应,然后8个,依此类推。
我决定做的是基本上使用signalr将我的页面改为私人聊天,然后抛弃了SqlDependency的东西。所以,现在如果用户转到一个页面,他们就会与页面上的任何其他人联系,并且只要有人提交了&#34;评论&#34;它也会被发送给查看该页面的其他人。