ASP.NET动态SignalR集线器?组?

时间:2018-05-03 20:39:57

标签: asp.net signalr

我有网页控件(仪表)我动态创建1到x(最大30),具体取决于页面加载时的作业设置。 SignalR Hub代码位于每20秒触发一次的计时器上。这样,我的动态量表每30秒就会获得数据。我使用客户端javascript函数guage.set_vale()设置控件的值。当集线器触发并设置值时,此功能每30秒循环一次。

   For i As Integer = 0 To 7
        Dim UserControl As WebUserControl1 = CType(Me.LoadControl("~/WebUserControl1.ascx"), WebUserControl1)
        UserControl.ID = "RG" & (i)  ''1_RadGauge

        UserControl.ControlWidth = 9
        UserControl.setTankNumber = i + 20
        Me.Panel1.Controls.Add(UserControl)

    Next

目前,所有控件都从同一个HUB获取数据。提供这些控件的数据是服务器端的SQL数据库。

SELECT top(1) * from zSignalR_DB_Test order by id desc

所以所有控件都显示相同的数据。 我想要做的是让每个控件显示其数据。因此,每个控件都将从数据库中获取自己的数据

    SELECT top(1) * from zSignalR_DB_Test WHERE ID = 'MyControlID' order by id desc

我看过SignalR Groups,但还没有看到如何做我想做的事情。通过这种方式,我需要做的就是将controlID与数据库中的数据相关联。

我的问题是:

对于我动态创建的每个控件,我是否需要一个单独的SignalR Hub?

我是否需要动态创建这些集线器?

SignalR小组是否正确地这样做?

如果我每30秒或每分钟更新一次,我不能只创建一个从客户端发回ID的方法,并且当我遍历客户端中的每个控件时(可能添加1秒暂停)发送ID a运行不同的SQL语句?

任何想法或例子都会很棒。

更多代码:

  <script type="text/javascript">
  $(function() {
        var logger = $.connection.loghub;
        logger.client.logMessage = function(msg) { 

            var ajaxPanel = document.getElementById("Panel1");  
            for (var x = 0; x < ajaxPanel.children.length; x=x+2) {  

                if (msg <=50){
                    var ImageElementGreen = ajaxPanel.children[x].children[0];
                    ImageElementGreen.style.visibility = 'visible'
                    var ImageElementRed = ajaxPanel.children[x].children[1];
                    ImageElementRed.style.visibility = 'hidden'
                } else {
                    var ImageElementGreen = ajaxPanel.children[x].children[0];
                    ImageElementGreen.style.visibility = 'hidden'
                    var ImageElementRed = ajaxPanel.children[x].children[1];
                    ImageElementRed.style.visibility = 'visible'
               }

                var TBValueElement = ajaxPanel.children[x].children[3].children[0];
                var TBValue = $find(TBValueElement.id);
                TBValue.set_value(msg + "%");

                var linearGaugeElement = ajaxPanel.children[x].children[4];
                var linearGauge = $find(linearGaugeElement.id);                           
                linearGauge.set_value(msg);  
            }
        };
        $.connection.hub.start();
    });     
</script>

1 个答案:

答案 0 :(得分:0)

在SignalIR示例中,它被声明.. &#34;启动服务器并连接客户端后,从一个客户端发送的消息将出现在所有连接的客户端中。您只需将各个客户数据指向正确的UI控件或“衡量”即可。创建一个类来存储,格式化和访问您的数据。

话虽这么说,SignalIR是基于WebSocket(s),这是一个可爱的异步&#39;实时&#39;服务。 Websockets不受.Net实现的约束,甚至可以将arduino配置为客户端或服务器。

如果要去websocket路线,请创建一些javascript来触发......

dependencies {
    compile("org.springframework.boot:spring-boot-starter-webflux:${springBootVersion}")
    compile('org.springframework.boot:spring-boot-starter-actuator')
    compile("org.springframework.data:spring-data-redis")
    compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client')
    compile("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    compile("org.jetbrains.kotlin:kotlin-reflect")
    compile("com.fasterxml.jackson.module:jackson-module-kotlin:2.9.5")
    runtime('org.springframework.boot:spring-boot-devtools')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}