代码之家  ›  专栏  ›  技术社区  ›  freegem

使用信号器将数据推送到客户端

  •  1
  • freegem  · 技术社区  · 8 年前

    很抱歉,在这里可能会创建一个重复的线程,但我无法通过遵循我发现的其他示例来让我的web应用程序完成我需要的任务。

    选项1-理想溶液

    选项2-可接受的解决方案

    我当前执行的 选项2 在下面。它涉及每60秒发送一个异步HTTP请求以获取数据:

    // start checking for new messages every 60 seconds
    setInterval(function () {
        $.ajax({
            async: true,
            type: "POST",
            contentType: "application/json; charset=utf-8;",
            url: "/AJAX_Handlers/CheckForNewMessages.ashx",
            dataType: "json",
            success: function (Result) {
                var new_message_received = Result[0]["NewMessageReceived"];
    
                if (new_message_received) {
                    $("#DIVMessageReminder").html("<strong>You have " + num_new_messages + " new message(s).</strong>");
                    $("#DIVMessageReminder").show();
                }
                else {
                    $("#DIVMessageReminder").hide();
                }
            }
        });
    }, 60000);
    

    作为一个简单的示例,我使用一种方法创建了以下中心,以获取服务器上的当前时间:

    Imports Microsoft.AspNet.SignalR
    
    Public Class ServerTimeHub
        Inherits Hub
    
        Public Sub GetServerTime()
            Dim current_time As String = Now.ToString()
            Clients.All.updateTime(current_time)
        End Sub
    
    End Class
    

    和基本文本框:

    <input id="TXTLongPollingTest" type="text" class="form-control" />
    

    var hub = $.connection.serverTimeHub;
    
    hub.client.updateTime = function (new_time) {
        $("#TXTLongPollingTest").val(new_time);
    }
    
    $.connection.hub.start().done(function () {
        alert("connected to the SignalR hub");
        hub.getServerTime();
    }).fail(function (err) {
        alert("failed to connect to SignalR hub: " + err);
    });
    

    起初,我试着让它只取一次服务器时间。我的代码将成功连接到中心,但随后它抛出一个错误,称为“Uncaught TypeError:hub.getServerTime不是函数”。这是我没能克服的第一个问题。

    第二个问题是:如何让中心以固定的间隔(例如每1秒)向客户端发送当前时间?

    1 回复  |  直到 8 年前
        1
  •  0
  •   Frank M    8 年前

    以下是我为实现类似目标所做的工作。基本上是从数据库中提取数据,并每30秒向客户端广播一次。

    protected void Application_Start(object sender, EventArgs e)
    {
        GetTeamData.TeamDataRepeater();
    }
    

    在我的GetTeamData中。cs我有一个计时器,设置为每30秒运行一次

    public class GetTeamData
      {    
        static Timer TeamDataTimer = new Timer();
    
        public static void TeamDataRepeater()
        {
              TeamDataTimer.Elapsed += new System.Timers.ElapsedEventHandler(OnTimedEvent_TeamDataBroadcaster);
              TeamDataTimer.Interval = 30000; //30 Seconds
              TeamDataTimer.Start(); 
        }
    
        public static void OnTimedEvent_TeamDataBroadcaster(Object sender, ElapsedEventArgs e)
        {
              updateFirstRow(); 
        }
    
        public static void updateFirstRow()
        {
              IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<MsgHub>();
              hubContext.Clients.All.pushMyData(mydata1, mydata2, mydata3);
        }           
    
       }
    

    //I have already started my connection
    
    $(function () {
        var chat = $.connection.msgHub;
        chat.client.pushMyData = function (mydata1, mydata2, mydata3)
        {
        //Do something with the returned data now
        }
    });
    

    注意,我删除了一些东西,例如使用try/catch,只是为了给你举个例子。

    希望这有帮助。