Mam naprawdę frustrujący problem, który nie może wydostać się na dno.Metoda klienta SignalR uruchamiana wiele razy w usłudze Angular Service
Używam SignalR do przekazywania wiadomości do urządzenia mobilnego, a metoda klienta jest uruchamiana wiele razy. Liczba uruchomień rośnie, gdy wylogowuję się, który powinien wyczyścić/zamknąć/zatrzymać połączenie.
My Hub wygląda następującym
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);
}
}
i mój kod klienta wygląda następująco:
.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;
}
Zostały zweryfikowane (lub przynajmniej wierzyć mam) dodaje
- Metoda
OnMessageCreated
na moim huba jest wywoływana tylko raz. - Po wylogowaniu z urządzenia mobilnego połączenie jest zamykane lub rozłączane.
Z dotychczasowych zachowań wygląda na to, że tworzone są połączenia lub metoda klienta jest rejestrowana wiele razy i pojawia się po zamknięciu połączenia, ale to nie wydaje się właściwe i nie mam nic ". mogliśmy to udowodnić.
Co jest przyczyną, lub może być przyczyną, że metoda klienta zostanie uruchomiona więcej niż jeden raz, biorąc pod uwagę powyższe informacje?
W tym momencie nie mogę sprawdzić, czy jest to kwestia kątowe lub problem SignalR
Chciałbym umieścić dziennik konsoli w $ rootScope $ na (funkcja 'UserAuthenticated' (zdarzenie, dane) { initializeConnection();}); –
Czym dokładnie jest problem? Że po wylogowaniu n razy 'initializeConnection' wysyła zapytania n + 1? –