【发布时间】:2015-12-01 14:01:16
【问题描述】:
我遇到了一个非常令人沮丧的问题,我似乎无法深入了解。
我正在使用 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}",_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 问题
【问题讨论】:
-
我会将控制台日志放入 $rootScope.$on('UserAuthenticated',function(event,data){ initializeConnection(); });
-
到底是什么问题?那
initializeConnection在注销n次后发送n+1个请求?
标签: angularjs signalr signalr-hub signalr.client