【问题标题】:MVC SignalR keep increasing request count on each reloadMVC SignalR 在每次重新加载时不断增加请求计数
【发布时间】:2019-10-06 04:31:15
【问题描述】:

我正在创建一个 ASP.NET MVC 应用程序,它使用“SqlDependecy”和“SignalR”技术根据数据库更改与服务器保持实时通信。它只是检查特定数据库记录中的字段值变化,然后将其显示在浏览器上。

尝试效果很好。但是当我通过浏览器“网络”性能监控网络请求时,每次刷新页面请求计数都会增加1。

如图所示。

  1. 初始页面加载只发出一个请求。
  2. 初始加载后首先刷新,然后更改数据库将导致发出 2 个请求。
  3. 初始加载后第二次刷新,然后更改 db 将导致发出 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>
&lt;div id="box" style="width:100px; height:100px; background-color: gray;"&gt;&lt;/div&gt;

[编辑 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();
    }
}

【问题讨论】:

    标签: javascript jquery asp.net-mvc signalr sqldependency


    【解决方案1】:

    在我的脑海中,我想说你并没有减少你的触发器处理程序,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();
    }
    

    【讨论】:

    • 我也在考虑这个,但我不知道在哪里放置事件处理程序的减量命令。我已经用控制器类和集线器类编辑了案例问题。
    • 为什么每次触发 SqlDependency 时都启动一个新的集线器?您的中心应该已经在运行。
    • 实际上“开始”只是一种定制方法,我用来通过集线器在客户端上下文中公开服务器端功能。我通过参考互联网上的许多解决方案来得出这个结论。我仍然对使用 SqlDependency 连接 SignalR 的正确方法感到非常困惑。我会研究你的建议,顺便试一试……
    • 要记住的关键是要确保每个SQL Dependency 只有一个handler,一旦依赖被触发就不会再次触发,所以需要确保handler 被移除。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-05
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多