在角度服务中多次发送SignalR客户端方法

时间:2015-11-21 06:23:53

标签: angularjs signalr signalr-hub signalr.client

我有一个非常令人沮丧的问题,我似乎无法深入到底。

我正在使用SignalR将消息推送到移动设备,并且多次触发客户端方法。当我退出时应该清除/关闭/停止连接时,它触发的次数会增加。

My Hub如下所示

public class MyHub:Hub
{
    private static string _groupIdentifier = "Test"
    public override Task OnConnected()
    {
        var identity =  //grab identity from auth provider
        Groups.Add(Context.ConnectionId, string.Format("{0}-{1}", _groupIdentifier, identity.UserId));
        return base.OnConnected();
    }

    public void OnMessageCreated(Message message)
    {
        IHubContext context = GlobalHost.ConnectionManager.GetHubContext<MessageCreatedEmitter>();
        context.Clients.Group(String.Format("{0}-{1}",_groupIdentifier, message.userId)).onMessageCreated(obj);
    }

    public override Task OnReconnected()
    {
        var identity = //grab identity from my auth provider
        Groups.Add(Context.ConnectionId, string.Format("{0}-{1}", _groupIdentifier, identity.UserId));
        return base.OnReconnected();
    }

    public override Task OnDisconnected(bool stopCalled)
    {
        var identity = //grab identity from my auth provider
        Groups.Remove(Context.ConnectionId, string.Format("{0}-{1}", _groupIdentifier, identity.UserId));
        return base.OnDisconnected(stopCalled);
    }
}

我的客户端代码如下所示:

.service('Messages',function($rootScope,$q,$log,User,ENV){
    var self = this;

    this.proxy = null;

    var initializeConnection = function(){
        self.proxy = null;
        var connection = $.hubConnection(ENV.socketEndpoint,{
            qs: {token:User.getToken()},
            logging: true,
            useDefaultPath: false
        });
        self.proxy = connection.createHubProxy('myHub');
        self.proxy.on('onMessageCreated',function(data){
          $rootScope.$emit('Messages:messageReceived',data);
        })

        connection.start().done(function(){
          $log.info('connected');
        })
    }

    var cleanupConnection = function(){
        if(self.proxy != undefined && self.proxy != null){
            self.proxy.connection.stop();
        }
    }

    $rootScope.$on('UserAuthenticated',function(event,data){
        initializeConnection();
    });

    $rootScope.$on('UserLoggedOut',function(event,data){
        cleanupConnection();
    });

    return self;
}

我已经验证(或至少相信我有)以下

  1. 我的集线器上的OnMessageCreated方法只被调用一次。
  2. 当我退出移动设备时,连接已关闭或断开连接。
  3. 从目前为止的行为来看,似乎正在建立连接,或者客户端方法被多次注册并在连接关闭后坚持下去,但这似乎并不正确,我无法做到证明这一点。

    根据上述信息,导致或可能导致客户端方法被多次触发的原因是什么?

    此时,我无法验证它是Angular问题还是SignalR问题

2 个答案:

答案 0 :(得分:1)

很可能是UserAuthenticated事件多次触发,但可以通过在连接开始周围进行OnMessageCreated检查来处理

$rootScope.$on('UserLoggedOut'

修改:我实际上看不到您调用Context.ConnectionId方法的位置?

调用断开连接时,您是否调试过signalR hub?我认为当用户断开连接时这会被正常调用,但是你也会在{{1}}上调用它,你的signalR集线器肯定无法在此时识别用户,因此它们将保留在你的Group集合中?如果是这种情况,您可能会发现奇怪的行为,例如多次调用被引发到组呼中的剩余{{1}}。

答案 1 :(得分:1)

我将专注于以正确的方式创建控制器。例如,有这种情况:

  

如果在$ routeProvider和HTML模板中指定了控制器,则每个声明都会创建一次。

服务本质上是单身人士,但你真正能够轻松搞砸的东西(正如我所做的那样)也在控制器中。我曾经处于这种情况,同样的数据被提取了四次。

我会仔细检查来自模板和routeprovider等的所有控制器调用,无论你在哪里引用或需要它。

每次注销都有新实例可能会引起路由器问题。也许来到根/上下文,具有服务的控制器一次又一次地被初始化。然后那些控制器会以复数形式解释你所做的每一个动作,然后就会出现混乱。

来源: AngularJS Controller execute twice