javascript - MVC SignalR 在每次重新加载时不断增加请求计数
问题描述
我正在创建一个 ASP.NET MVC 应用程序,它使用“SqlDependecy”和“SignalR”技术根据数据库更改与服务器保持实时通信。它只是检查特定数据库记录中的字段值更改,然后将其显示在浏览器上。
尝试效果很好。但是当我通过浏览器“网络”性能监控网络请求时,每次刷新页面时请求计数都会增加 1。
如图所示。
- 初始页面加载仅发出一个请求。
- 初始加载后首先刷新,然后 db 更改将导致发出 2 个请求。
- 初始加载后第二次刷新然后数据库更改将导致发出 3 个请求。
很快...
我试过的js代码如下。
这对我来说似乎是个问题。如果这是一个真正的问题,任何对此的建议将不胜感激。非常感谢。
<script type="text/javascript">
$(function () {
var jHub = $.connection.journeyHub;
$.connection.hub.start();
jHub.client.ListenChange = function () {
getData();
}
jHub.client.ListenChange();
});
function getData() {
$.ajax({
url: 'GetValue',
type: 'GET',
dataType: 'json',
success: function (data) {
if (data == "pending") {
$("#box").css({ "background-color": "orange" });
}
else if (data == "deny") {
$("#box").css({ "background-color": "red" });
}
else if (data == "success") {
$("#box").css({ "background-color": "green" });
}
}
});
}
</script>
<div id="box" style="width:100px; height:100px; background-color: gray;"></div>
[编辑 v1] 这是事件处理程序所在的控制器。
public class TravelController : Controller
{
SqlConnection link = new SqlConnection(ConfigurationManager.ConnectionStrings["linkTraveller"].ConnectionString);
// GET: Travel
public ActionResult Listen()
{
return View();
}
public ActionResult GetValue()
{
using (IDbConnection conn = link)
{
string query = @"SELECT [Status] FROM [dbo].[Journey] WHERE [Id]=1";
SqlCommand command = new SqlCommand(query, link);
SqlDependency sqlDep = new SqlDependency(command);
sqlDep.OnChange += new OnChangeEventHandler((sender, e) => sqlDep_OnChange(sender, e));
conn.Open();
string status = command.ExecuteScalar().ToString();
return Json(status, JsonRequestBehavior.AllowGet);
}
}
private void sqlDep_OnChange(object sender, SqlNotificationEventArgs e)
{
JourneyHub.Start();
}
}
这里是集线器
public class JourneyHub : Hub
{
public static void Start()
{
var context = GlobalHost.ConnectionManager.GetHubContext<JourneyHub>();
context.Clients.All.ListenChange();
}
}
解决方案
在我的脑海中,我会说你没有减少你的触发器处理程序,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();
}
推荐阅读
- c - C-错误中的锯齿状数组实现:预期的';' 在声明列表的末尾
- css - 溢出-y滚动导致内容被切断
- python - how to make a infinute loop of a varible
- ruby - Add a dependency in a project using gem
- php - 使用php将sqlite数据转换为json
- python - 根据 pandas 中的日期范围创建 FY
- javascript - JavaScript async & defer:异步运行脚本
- automated-tests - Klov 服务器抛出 freemarker.core._TemplateModelException - 无法在 Klov 服务器上生成/查看任何范围报告
- laravel - 如何在 Laravel 中与承载令牌一起进行 CSRF 验证?
- ios - 设置 UITableHeaderFooterView 的 backgroundColor 时出错