2015-11-21 1 views
16

私は本当に不満足な問題を抱えています。アングルサービスで複数回発せられたSignalRクライアントメソッド

私は、メッセージをモバイルデバイスにプッシュするために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; 
} 

は、私が確認している(あるいは、少なくとも私が持っていると信じて)

  1. 私のハブのOnMessageCreatedメソッドは一度だけ呼び出されます。
  2. モバイルデバイスからログアウトすると、接続が切断または切断されます。

これまでの動作から、接続が行われているように見えるか、接続が閉じられた後にクライアントメソッドが複数回登録されていたようですが、これは正しいようではなく、それを証明することができました。

クライアントのメソッドが上記の情報を与えられて複数回起動される原因は何ですか?この時点で、私はそれが角度の問題やSignalRの問題

+0

私は$ rootScopeでコンソールログを置く$( 'UserAuthenticated'、機能(イベント、データ){ initializeConnection();} )に;。 –

+0

問題はなんですか? n回ログアウトした後、 'initializeConnection'はn + 1リクエストを送信していますか? –

答えて

1

であればこれはよくUserAuthenticatedイベントが複数回発射されたが、それは周り$.signalR.connectionState.disconnectedチェックを置くことによって処理される可能性がある可能性があり

を確認することはできません接続開始

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

    } 

} 

編集:あなたはOnMessageCreatedメソッドを呼び出すところ私は実際には表示されないのですか?

また、切断時にsignalRハブをデバッグしましたか?ユーザーが切断するとこれが通常と呼ばれると思われますが、$rootScope.$on('UserLoggedOut'でもsignalRハブはこの時点でユーザーを識別できないため、グループコレクションに残っていますか?そうであれば、複数のコールをグループコールの残余Context.ConnectionIdに送信するなど、奇妙な動作が予想されます。

+0

私はこれを試みましたが、認証されたユーザーは一度だけ起動されますが、 'onMessageCreated'は複数回起動されています – TheJediCowboy

1

私は正しい方法でコントローラを作成することに焦点を合わせます。たとえば、この種の状況は次のとおりです。

コントローラが$ routeProviderで指定され、HTMLテンプレートでコントローラが指定されている場合は、宣言ごとに1回作成されます。

サービスは本質的にシングルトンですが、実際には簡単に(私もやったように)コントローラを使っています。私はかつて同じデータが4回取り出された状況にあった。

私はテンプレートとrouteproviderなどから、すべてのコントローラコールを参照したり、必要としている場所でチェックします。

すべてのログアウトで新しいインスタンスを作成すると、ルータの問題が発生する可能性があります。おそらくルートに来る/コンテキストは、サービスを持つコントローラが何度も何度も初期化されます。そして、それらのコントローラーはあなたが複数のアクションを解釈し、混乱します。

出典:AngularJS Controller execute twice

関連する問題