加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angularjs – SignalR客户端方法在角度服务中多次发射

发布时间:2020-12-17 08:06:00 所属栏目:安全 来源:网络整理
导读:我有一个非常令人沮丧的问题,我似乎无法达到底线。 我正在使用SignalR将消息推送到移动设备,并且客户端方法被多次触发。当我注销哪个应该清理/关闭/停止连接时,它触发的次数会增长。 我的Hub看起来像下面这样 public class MyHub:Hub{ private static str
我有一个非常令人沮丧的问题,我似乎无法达到底线。

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

我的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}",message.userId)).onMessageCreated(obj);
    }

    public override Task OnReconnected()
    {
        var identity = //grab identity from my auth provider
        Groups.Add(Context.ConnectionId,identity.UserId));
        return base.OnReconnected();
    }

    public override Task OnDisconnected(bool stopCalled)
    {
        var identity = //grab identity from my auth provider
        Groups.Remove(Context.ConnectionId,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',data){
        cleanupConnection();
    });

    return self;
}

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

>我的集线器上的OnMessageCreated方法只被调用一次。
>当我注销我的移动设备时,连接被关闭或断开连接。

从目前的行为来看,似乎正在建立连接,或者客户端方法正在多次注册,并且在连接关闭后坚持,但是这似乎不正确,我无法证明它。

以上信息导致或可能导致客户端方法多次被触发?

在这一点上,我无法验证它是一个角色问题还是SignalR问题

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

If the controller is specified in the $routeProvider and in the HTML template it will get create once for each declaration.

服务是大自然的单身,但你真的可以很容易地混乱(正如我已经做的)在控制器。我曾经遇到过这样的情况,同样的数据被提取了四次。

我会双重检查所有控制器调用从模板和路由器,等等,你正在引用或需要一个。

在每次注销时都有新的实例可能引用路由器问题。可能来到根/上下文,具有该服务的控制器被重新初始化。那么这些控制器就会解释你所做的复数和混乱的每一个动作。

资料来源:AngularJS Controller execute twice

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读