我正在实现在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()......“在两个地方正在创造这个问题。请帮助。
答案 0 :(得分:2)
您需要在调用start之前连接所有回调。如果您打开客户端登录,它会告诉您订阅了哪些集线器。
除了: [EnableCors]是一个特定于webapi的属性,在SignalR中不起作用。