angularjs signalr signalr-hub signalr.client

angularjs - Método de cliente de SignalR activado varias veces en servicio angular



signalr-hub signalr.client (2)

Bien podría ser que el evento UserAuthenticated se dispare varias veces, pero podría manejarse colocando un cheque $.signalR.connectionState.disconnected alrededor del inicio de la conexión

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

Edit: ¿Realmente no veo donde se llama el método OnMessageCreated ?

¿También ha depurado el concentrador signalR cuando llama a una desconexión? Supongo que esto se llama normalmente cuando un usuario se desconecta, sin embargo, también lo llama en $rootScope.$on(''UserLoggedOut'' seguramente su centro de signalR no podrá identificar al usuario en este punto y, por lo tanto, permanecerán en su ¿Colección de grupo? Si ese es el caso, podría esperar un comportamiento extraño, como el hecho de que varias llamadas se Context.ConnectionId al Context.ConnectionId residual en las llamadas de grupo.

Estoy teniendo un problema realmente frustrante que parece que no puedo llegar al fondo de.

Estoy usando SignalR para enviar mensajes a un dispositivo móvil y el método del cliente se está activando varias veces. La cantidad de veces que se dispara aumenta cuando cierro la sesión, lo que se supone que limpia / cierra / detiene la conexión.

Mi Hub se parece a lo siguiente

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

y mi código de cliente se parece a lo siguiente:

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

He verificado (o al menos creo que tengo) lo siguiente

  1. El método OnMessageCreated en mi hub solo se invoca una vez.
  2. Cuando me desconecto de mi dispositivo móvil, la conexión se cierra o se desconecta.

A partir del comportamiento hasta el momento, parece que se están haciendo conexiones o que el método del cliente se registra varias veces y se mantiene después de que se cierra la conexión, pero esto no parece correcto y no he podido demostrarlo. .

¿Qué está causando, o podría estar causando que el método del cliente se dispare más de una vez dada la información anterior?

En este momento, no puedo verificar si se trata de un problema angular o de SignalR


Me concentraría en crear el controlador de la manera correcta. Por ejemplo, este tipo de situaciones están ahí:

Si el controlador se especifica en $ routeProvider y en la plantilla HTML, se creará una vez para cada declaración.

Los servicios son por naturaleza singletons, pero lo que realmente puedes perder fácilmente (como lo he hecho yo también) está en los controladores. Una vez estuve en una situación, donde los mismos datos fueron obtenidos cuatro veces.

Revisaría todas las llamadas de controlador desde las plantillas y el proveedor de enrutamiento, etc., donde sea que haga referencia o necesite una.

Tener nuevas instancias en cada cierre de sesión puede referirse a un problema de enrutador. Tal vez llegando a la raíz / contexto, un controlador que tiene el servicio se inicializa una y otra vez. Luego esos controladores interpretan cada acción que haces en plural y el desorden está ahí.

Fuente: Controlador AngularJS ejecutar dos veces