Javascript MVC信号器在每次重新加载时不断增加请求计数
我正在创建一个ASP.NET MVC应用程序,它使用“SqlDependecy”和“SignalR”技术来根据数据库更改维护与服务器的实时通信。它只需检查特定数据库记录中的字段值更改,然后将其显示在浏览器上 这一尝试效果很好。但是,当我通过浏览器“网络”性能监视网络请求时,每次刷新页面时,请求计数都会增加1 如图所示Javascript MVC信号器在每次重新加载时不断增加请求计数,javascript,jquery,asp.net-mvc,signalr,sqldependency,Javascript,Jquery,Asp.net Mvc,Signalr,Sqldependency,我正在创建一个ASP.NET MVC应用程序,它使用“SqlDependecy”和“SignalR”技术来根据数据库更改维护与服务器的实时通信。它只需检查特定数据库记录中的字段值更改,然后将其显示在浏览器上 这一尝试效果很好。但是,当我通过浏览器“网络”性能监视网络请求时,每次刷新页面时,请求计数都会增加1 如图所示 初始页面加载仅发出一个请求 在初始加载后首先刷新,然后db更改将导致发出2个请求 在初始加载后进行第二次刷新,然后更改数据库将导致发出3个请求 等等 下面给出了我尝试过的js代码
$(函数(){
var jHub=$.connection.journeyHub;
$.connection.hub.start();
jHub.client.ListenChange=函数(){
getData();
}
jHub.client.ListenChange();
});
函数getData(){
$.ajax({
url:'GetValue',
键入:“GET”,
数据类型:“json”,
成功:功能(数据){
如果(数据==“待定”){
$(“#框”).css({“背景色”:“橙色”});
}
else if(数据==“拒绝”){
$(“#框”).css({“背景色”:“红色”});
}
否则如果(数据=“成功”){
$(“#框”).css({“背景色”:“绿色”});
}
}
});
}
在我的脑海中,我想说的是,你没有减少你的触发器处理程序,sql依赖触发器只会触发一次,然后它们就消失了,你必须记住删除事件处理程序,或者它们只是继续添加,但是我肯定你能发布你的sql依赖触发器代码
这是我多年前做的一件事的一个例子,但想法仍然是一样的
try
{
using (
var connection =
new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString))
{
connection.Open();
using (SqlCommand command = new SqlCommand(@"SELECT [Id]
,[FName]
,[LName]
,[DOB]
,[Notes]
,[PendingReview]
FROM [dbo].[Users]",
connection))
{
// Make sure the command object does not already have
// a notification object associated with it.
command.Notification = null;
SqlDependency dependency = new SqlDependency(command);
dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
if (connection.State == ConnectionState.Closed)
connection.Open();
command.ExecuteReader();
}
}
}
catch (Exception e)
{
throw;
}
}
private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
SqlDependency dependency = sender as SqlDependency;
if (dependency != null) dependency.OnChange -= dependency_OnChange;
//Recall your SQLDependency setup method here.
SetupDependency();
JobHub.Show();
}
我也在考虑这个问题,但我不知道事件处理程序的递减命令放在哪里。我已经用controller类和hub类编辑了案例问题。为什么每次SqlDependency触发时都要启动一个新的hub?您的中心应该已经在运行了。实际上,“Start”只是一个自定义方法,我正在使用它通过中心在客户端上下文中公开服务器端函数。我是通过参考互联网上的许多解决方案得出这一结论的。我仍然对用SqlDependency连接信号器的正确方法感到困惑。我将研究您的建议,并顺便尝试一下……要记住的关键是确保每个SQL依赖项只有一个处理程序,一旦触发依赖项,它将不会再次触发,因此需要确保删除该处理程序。