SignalR不会将消息推送到客户端

时间:2014-11-14 16:04:46

标签: angularjs sockets signalr long-polling connection

我正在实现在AngularJS应用程序中使用SignalR通知用户长时间运行的作业完成的功能。我已经根据他们的名称创建了用户组,因此对于每个用户他已经打开了一组他的名字和不同的连接将创建up并且他的小组会通知他。我想在两个页面上通知用户,即登陆页面和作业运行页面,即使用户在登录页面上并且作业运行完成,也应该通知他。

出于同样的原因,我在两个页面上都按照他的名字创建了小组,所以如果他在任何一个页面上,他就会在小组中被发现。

在着陆页控制器js文件中,我编写了代码以将用户添加到组中,如下所示...

$rootScope.signalRHub = $.connection.signalRHub;

$rootScope.hubStart = null;

$rootScope.startHub = function () {

    if ($rootScope.hubStart == null)
    {
        $rootScope.hubStart = $.connection.hub.start();
    }
    return $rootScope.hubStart;
}

$scope.$on('$locationChangeStart', function (event) {

        if ($rootScope.userName != "") {
            $rootScope.signalRHub.server.leaveGroup($rootScope.userName);
        }
});

// Start the connection
$rootScope.startHub().done(function () {

        $rootScope.signalRHub.server.joinGroup($rootScope.userName);
});

在Job Run控制器js文件上我编写了以下代码....

$rootScope.signalRHub.client.showNotification = function (message) {
    notify('Your notification message');//notify is the angular js directive injected in this controller which runs fine
};

$scope.$on('$locationChangeStart', function (event) {
        $rootScope.signalRHub.server.leaveGroup($rootScope.studyid);
});

// Start the connection    
$rootScope.startHub().done(function () {

    $rootScope.signalRHub.server.joinGroup($rootScope.userName
});

我的中心文件.....

[EnableCors(origins: "*", headers: "*", methods: "*")]
    public class SignalRHub : Hub
    {        
        public Task JoinGroup(string groupName)
        {
            return Groups.Add(Context.ConnectionId, groupName);
        }       

        public Task LeaveGroup(string groupName)
        {
            return Groups.Remove(Context.ConnectionId, groupName);
        }

        public void ShowNotification(string jobRunDetailId, string userName)
        {
            if (!string.IsNullOrEmpty(userName))
            {
                var context = GlobalHost.ConnectionManager.GetHubContext<SignalRHub>();

                context.Clients.Group(userName).showNotification(jobRunDetailId);
            }
        }
    }

问题是,当我运行应用程序时,两个页面的组添加功能都可以正常工作。但是当我从Hub调用“showNotification”时,它不会显示任何消息。

但奇怪的是,如果我在登陆页面上评论“$ rootScope.startHub()。done ....”函数,那么jobrun页面通知功能正常。我不确定是否写“$ rootScope.startHub( ).done()......“在两个地方正在创造这个问题。请帮助。

1 个答案:

答案 0 :(得分:2)

您需要在调用start之前连接所有回调。如果您打开客户端登录,它会告诉您订阅了哪些集线器。

除了: [EnableCors]是一个特定于webapi的属性,在SignalR中不起作用。