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);
}
実際、その違いは静的であるという事実... – thab