gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:03:04 26 4
gpt4 key购买 nike

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

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

我的集线器如下所示

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;
}

我已经验证(或至少相信我拥有)以下内容
  • OnMessageCreated我的集线器上的方法只被调用一次。
  • 当我退出移动设备时,连接已关闭或断开。

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

    鉴于上述信息,是什么导致或可能导致客户端方法被多次触发?

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

    最佳答案

    我会专注于以正确的方式创建 Controller 。例如,有这种情况:

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



    服务本质上是单例的,但你真正可以轻松搞定的东西(就像我所做的那样)是在 Controller 中。我曾经遇到过四次获取相同数据的情况。

    我会仔细检查来自模板和路由提供程序等的所有 Controller 调用,无论你在哪里引用或需要一个。

    每次注销时都有新实例可能是指路由器问题。可能要 Root /具有服务的 Controller 的上下文被一次又一次地初始化。然后那些 Controller 以复数形式解释你所做的每一个 Action ,并且困惑在那里。

    来源: AngularJS Controller execute twice

    关于angularjs - SignalR 客户端方法在 Angular 服务中多次触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33840408/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com