2017-09-27 15 views
0

Signalr Hubクラスを継承し、起動時に実行されるクラスを作成しました。接続が確立されると、ユーザーオブジェクトを生成するために使用するカスタムヘッダーがクライアントから送信されます。私はリストを取得してUIで表示できるように、これらをサーバー上のメモリーに保管したいと考えています。誰かがこのUIを使用してユーザー情報を表示し、この接続との対話を実行できます。 ASP MVCプロジェクトでハブクラスをセットアップしました。クライアント用にコンソールアプリケーションを使用しています。私はうまく接続することができますし、サーバーが通信することができますが、接続されたユーザーを追跡するためにハブクラスで使用するプロパティは、要求がハブクラスに要求されるたびにnullにリセットされます。Signalrハブクラスを使用して接続したユーザーを追跡できません

public class JobRunHandler : Hub 
{ 
    private List<JobRunClient> RunningJobs { get; set; } 

    public JobRunHandler() 
    { 
     if(this.RunningJobs == null) this.RunningJobs = new List<JobRunClient>(); 
} 

public override Task OnConnected() 
{ 
    JobRunClient runclient = new JobRunClient() 
    { 
     ConnectionID = Context.ConnectionId, 
     Someotherstuff = this.GetHeaderInt(Context.Headers["Someotherstuff"]) 
    }; 

    this.RunningJobs.Add(runclient); 
    return base.OnConnected(); 
} 

public override Task OnReconnected() 
{ 
    var existingClient = this.GetConnectingClient(); 
    if (existingClient == null) 
    { 
     JobRunClient runclient = new JobRunClient() 
     { 
      ConnectionID = Context.ConnectionId, 
      Someotherstuff = this.GetHeaderInt(Context.Headers["Someotherstuff"]) 
     }; 

     this.RunningJobs.Add(runclient); 
    } 
    return base.OnReconnected(); 
} 

public override Task OnDisconnected(bool stopCalled) 
{ 
    this.RemoveClient(Context.ConnectionId); 
    return base.OnDisconnected(stopCalled); 
} 

public void TestMethod() 
{ 
    Clients.All.ping(); 
    var client = this.GetConnectingClient(); 
} 

}

私はそれを実行したときに私が知っているすべてのメソッドにブレークポイントを入れています。クライアントは再接続を切断またはトリガーすることはありません。したがって、接続が切断されても問題はありません。クライアントが接続し、OnConnected()メソッドがトリガーされ、値がthis.RunningJobsに追加されます。クライアントはTestMethod()を呼び出しますが、this.RunningJobsをチェックすると空です。

Clients.All.ping();が実行されると、実際にクライアントにpingが送信されます。だから、接続が正常に行われ、サーバーは接続を維持し、別のメソッドが呼び出されたときにクライアントにpingを送り返すことができますが、何らかの理由でプロパティがリセットされています。私がする必要がある場合私はこれのためにredisを使用することができますが、私は他の人がこの戦略を使用しているのを見て、それは問題ではありませんでした。ここで

は、私は、この(コンソールアプリケーション)をテストするために作成したクライアントコード

var hubConnection = new HubConnection("http://localhost:2497/"); 
    hubConnection.Credentials = CredentialCache.DefaultNetworkCredentials; 
    IHubProxy myHubProxy = hubConnection.CreateHubProxy("JobRunHandler"); 

    myHubProxy.On("ping",() => Console.Write("Recieved ping \n")); 
    hubConnection.Headers.Add("Someotherstuff", "1"); 
    hubConnection.Start().Wait(); 


    while(true) 
    { 
     myHubProxy.Invoke("BroadcastCompletion").ContinueWith(task => 
     { 
      if (task.IsFaulted) 
      { 
       Console.WriteLine("!!! There was an error opening the connection:{0} \n", task.Exception.GetBaseException()); 
      } 

     }).Wait(); 
     Console.WriteLine("Broadcast sent to the server.\n"); 
     Thread.Sleep(4000); 
    } 

答えて

1

ハブが一過性です。 SignalRはハブ・メソッドが呼び出されるたびにハブ・インスタンスを作成し、コール間でインスタンス・プロパティーにステートを保管することはできません。

0

これに使用されているプロパティをConcurrentDictionaryに変更しました。これはトリックを実行しているようです。これにより、すべての接続にクライアント接続を格納することができます。私はこれに次のコードを使用しました。

private static readonly ConcurrentDictionary<string, JobRunClient> RunningJobs = new ConcurrentDictionary<string, JobRunClient>(); 
+0

実際、その違いは静的であるという事実... – thab

関連する問題