我有一个非常令人沮丧的问题,我似乎无法达到底线。
我正在使用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.
服务是大自然的单身,但你真的可以很容易地混乱(正如我已经做的)在控制器。我曾经遇到过这样的情况,同样的数据被提取了四次。
我会双重检查所有控制器调用从模板和路由器,等等,你正在引用或需要一个。
在每次注销时都有新的实例可能引用路由器问题。可能来到根/上下文,具有该服务的控制器被重新初始化。那么这些控制器就会解释你所做的复数和混乱的每一个动作。