C# 多次触发客户端集线器事件的信号器
我正在使用带有SQLDependency的SignalR,以便在SQL Server数据库中的一个表发生更改时获取通知。 通知工作正常-但我看到一个问题。随着数据库中的更改越来越多,SignalR看起来会为数据库中的单个更改触发多个客户端中心事件 查看控制台,我得到以下信息: [16:32:30 GMT-0700(太平洋夏令时)]信号器:在集线器“MessangerHub”上触发客户端集线器事件“sendMessage” [16:32:30 GMT-0700(太平洋夏令时)]信号器:在集线器“MessangerHub”上触发客户端集线器事件“sendMessage”。 事件似乎被多次触发。 任何帮助都将不胜感激C# 多次触发客户端集线器事件的信号器,c#,asp.net-mvc,signalr,signalr-hub,sqldependency,C#,Asp.net Mvc,Signalr,Signalr Hub,Sqldependency,我正在使用带有SQLDependency的SignalR,以便在SQL Server数据库中的一个表发生更改时获取通知。 通知工作正常-但我看到一个问题。随着数据库中的更改越来越多,SignalR看起来会为数据库中的单个更改触发多个客户端中心事件 查看控制台,我得到以下信息: [16:32:30 GMT-0700(太平洋夏令时)]信号器:在集线器“MessangerHub”上触发客户端集线器事件“sendMessage” [16:32:30 GMT-0700(太平洋夏令时)]信号器:在集线器“M
public IEnumerable<Internal.Core.Model.ShipmentStatusInfo> GetShipments(DateTime lastStatusUpdatedDate)
{
using (var conn = new SqlConnection(Config.Instance.ShipmentConnection))
{
conn.Open();
var q = "SELECT dbo.Shipment.ShipmentID, dbo.Shipment.[STATUS], dbo.Shipment.[LAST_MODIFIED_DATE] "+
" FROM dbo.Shipment WHERE name like @name and [Shipment].[LAST_MODIFIED_DATE] > @date";
using (var cmd = new SqlCommand(q, conn))
{
cmd.Parameters.Add("@date", SqlDbType.DateTime).Value = lastStatusUpdatedDate;
cmd.Parameters.Add("@name", SqlDbType.VarChar).Value = Config.Instance.Name;
SqlDependency dependency = new SqlDependency(cmd);
dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
using (var reader = cmd.ExecuteReader())
{
return reader.Cast<IDataRecord>().Select(x => new Internal.Core.Model.ShipmentStatusInfo()
{
ShipmentId = x.GetString(0),
Status = x.GetString(1)
}).ToList();
}
}
}
}
void dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
if (e.Type == SqlNotificationType.Change || e.Info == SqlNotificationInfo.Update || e.Info == SqlNotificationInfo.Insert)
{
StatusUpdateHub.Send();
}
}
public IEnumerable GetShippings(DateTime LastStatusUpdateDate)
{
使用(var conn=newsqlconnection(Config.Instance.ShipmentConnection))
{
conn.Open();
var q=“选择dbo.shipping.ShipmentID,dbo.shipping.[STATUS],dbo.shipping.[LAST\u MODIFIED\u DATE]”+
“来自dbo.shipping,其中名称如@name和[shipping]。[上次修改日期]>@DATE”;
使用(var cmd=new SqlCommand(q,conn))
{
cmd.Parameters.Add(“@date”,SqlDbType.DateTime).Value=lastStatusUpdateDate;
cmd.Parameters.Add(“@name”,SqlDbType.VarChar).Value=Config.Instance.name;
SqlDependency=新的SqlDependency(cmd);
dependency.OnChange+=新的OnChangeEventHandler(dependency\u OnChange);
if(conn.State==ConnectionState.Closed)
{
conn.Open();
}
使用(var reader=cmd.ExecuteReader())
{
return reader.Cast().Select(x=>new Internal.Core.Model.ShipmentStatusInfo())
{
ShipmentId=x.GetString(0),
Status=x.GetString(1)
}).ToList();
}
}
}
}
void dependency_OnChange(对象发送方,SqlNotificationEventArgs e)
{
if(e.Type==SqlNotificationType.Change | | e.Info==SqlNotificationInfo.Update | | e.Info==SqlNotificationInfo.Insert)
{
StatusUpdateHub.Send();
}
}
显示您的代码。另外,你正在做这样的事情:谢谢你的时间。我已经包括了我的代码。我的做法有点不同。上面复制的日志是从您的hub方法还是从javascript客户端复制的?客户端是javasript吗?在hub方法中添加断点并查看调用该方法的时间和原因也可能很有用。问题是,只有在部署到服务器后,才会发生多次调用。这在我的开发环境中从未发生过,通过放置断点无法看到它。