在页面刷新后,SignalR不向客户端广播数据

时间:2015-06-17 16:26:31

标签: jquery asp.net ajax signalr signalr-hub

我使用SignalR创建了一个HUB,我在其中订阅统计信息并从服务器接收响应。当我第一次登录时,我收到客户端的所有统计数据,我使用SignalR Hub登录时订阅了。

它通过SignalR HUB不断向客户端广播更新的统计数据,直到我不刷新页面。刷新页面后,SignalR会停止向客户端广播更新的统计数据。

调试时我可以看到数据在_jsonStatsData变量中,它是集线器上下文的数据,用于将其广播到客户端,但不知何故它不是广播,我在控制台中得到null。日志中。

客户端:

$(function () {

    var notifications = $.connection.localServerHub;

    notifications.client.receivedUpdatedStats = function (updatedStats) {

       console.log(updatedStats); 

    };  

    $.connection.hub.logging = true;

    $.connection.hub.start().done(function () {

        // Passing the Stats value from here e.g 5
        notifications.server.subscribeStats(5);

    }).fail(function (e) {
        alert(e);
    });

}); 

HUB方法和代表:

[HubName("localServerHub")]
public class LocalServerHub : Hub
{
    private string _jsonStatsData = string.Empty;

    [HubMethodName("subscribeStats")]
    public string SubscribeStats(string statId)
    {
        lock (LoginUsers.ConnectedUsersList)
        {

            if (!_objHubClient.Subscribe)
            {
                _objHubClient.ResponseEvent += new HubClient.ResponseBO(Response_Recieved);

                _objHubClient.Subscribe = true;
            }

            objHubClient.SubscribeStatsNotifications(Convert.ToInt32(statId));

            return Clients.Caller.RecievedUpdatedStats(_jsonStatsData).ToString();
        }
    }

    private void Response_Recieved(Messages objMessage)
    {
        try
        {
            if (objMessage.OperationType == Operation.StatsUpdateNotification)
            {
                _jsonStatsData = JsonConvert.SerializeObject(objMessage.ResponseStats);
                SubscribeQueueStats(string.Empty);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
        }
    }
}

刷新页面后可能出现什么问题? 没有会话超时问题,也没有断开连接问题,但在客户端刷新后仍然没有任何问题。

1 个答案:

答案 0 :(得分:0)

这是我多年前所做的事情。它肯定会帮助别人。

在页面刷新后,SignalR停止广播的原因是什么;它失去了必须向其客户广播消息的集线器上下文。

所以我做的是,我为集线器上下文创建了一个新的引用,即使在页面刷新后也会广播消息。

IHubContext context = GlobalHost.ConnectionManager.GetHubContext<LocalServerHub>();

return context.Clients.Caller.RecievedUpdatedStats(_jsonStatsData).ToString();