首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SignalR客户端方法在Angular服务中多次触发

SignalR客户端方法在Angular服务中多次触发
EN

Stack Overflow用户
提问于 2015-11-21 14:23:53
回答 2查看 2.2K关注 0票数 17

我有一个非常令人沮丧的问题,我似乎无法弄清楚。

我正在使用SignalR将消息推送到移动设备,而客户端方法被多次触发。当我注销时,它触发的次数会增加,这应该是为了清理/关闭/停止连接。

My Hub如下所示

代码语言:javascript
复制
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);
    }
}

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

代码语言:javascript
复制
.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. 当我从移动设备注销时,连接关闭或断开。

到目前为止,从行为上看,似乎正在建立连接,或者客户端方法被多次注册并在连接关闭后仍然存在,但这似乎不正确,我无法证明这一点。

在给定上述信息的情况下,是什么导致或可能导致客户端方法多次触发?

在这一点上,我不能验证这是一个角度问题还是一个SignalR问题

EN

回答 2

Stack Overflow用户

发布于 2015-11-27 20:58:38

很可能是UserAuthenticated事件被多次触发,但可以通过在连接开始时放置一个$.signalR.connectionState.disconnected检查来处理

代码语言:javascript
复制
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);
    })

    if ($.connection.hub && $.connection.hub.state === $.signalR.connectionState.disconnected){

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

    }

}

编辑:我实际上看不到你在哪里调用OnMessageCreated方法?

另外,在调用断开连接时,您是否调试过signalR集线器?我假设当用户断开连接时,这是正常的调用,但是你也在$rootScope.$on('UserLoggedOut'上调用它肯定你的signalR集线器在这一点上不能识别用户,因此他们将保留在你的组集合中?如果是这样的话,您可能会遇到奇怪的行为,比如多个调用会被提升到组调用中的剩余Context.ConnectionId

票数 1
EN

Stack Overflow用户

发布于 2015-11-30 02:23:21

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

如果控制器是在$routeProvider和HTML模板中指定的,它将为每个声明创建一次。

服务本质上是单例的,但您真正可以轻松处理的(正如我所做的那样)是在控制器中。我曾经在一种情况下,同样的数据被获取了四次。

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

每次注销时都有新的实例可能涉及路由器问题。也许在进入根/上下文时,拥有服务的控制器会一次又一次地被初始化。然后,这些控制器以复数的形式解释你所做的每一个动作,混乱就在那里。

来源: AngularJS Controller execute twice

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33840408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档