ASP.NET MVC 4 アプリケーションで SignalR とユーザーが ID を変更すると問題が発生します。カスタム メンバーシップ プロバイダーでフォーム認証を使用しています。
私が SignalR を使用しているビューには、ログイン (およびログアウト) ボタンもあり、ログインしているユーザーとログアウトしているユーザーの両方がこのビューを見ることができる (そして、それに関連付けられている SignalR グループにすべて接続されている) ことが不可欠です。見る)。ただし、人々がログインするとトラブルが発生し続けます。ユーザー ID が変更されたときに基になる SignalR 接続を「再接続」するための推奨される方法は何ですか? このビューは、他のアクションによって表示されるいくつかのビューの 1 つです。これは、SignalR JavaScript が含まれている唯一のものです。
実際、私はユーザーの身元にはあまり関心がないので、何らかの方法でユーザー アフィニティをオフにすることは問題ありません (しかし、それを行う方法が見つかりませんでした)。ログイン/ログアウトは接続を維持しているウィンドウ以外のウィンドウで行われたため、ユーザーの変更によってページのリロードがトリガーされても問題ありません。後者にはユーザーのフォーカスがありません。
質問、つまり、ユーザー ID がログインしているユーザーからログアウトしているユーザーに変更された場合、またはその逆の場合に、基になる SignalR 接続を維持するにはどうすればよいでしょうか?
私が試したこと
次のように、ページ上でログイン/ログアウト イベントを処理します。
$("a[href='/Account/Logout']").click(function () { $.connection.hub.stop(); });
これは機能しますが、SignalR を実際に使用するページだけでなく、ユーザーがログインまたはログアウトできるすべてのページで SignalR が必要になります。
ログインとログアウトの間で一貫性を保つ、ASP.NET セッション ID をキーとする追加のグループをハブに追加します。ログインまたはログアウト時に、そのセッション ID を持つグループに再接続のトリガーを送信して、クライアントに通知しました。これは手遅れであることが判明しました。リクエストの終わりまでにIDがすでに変更されていたため、例外が発生しました。
私のセットアップの詳細
この特定のユース ケースでは、SignalR を含むページがユーザーに表示されます。いつものようにハブに参加します。
var hub = $.connection.theNameOfTheHub;
$.connection.hub.start().done(function () {
hub.server.joinList(id);
});
この例では、いくつかの名前を変更しました。基本的には、ページに表示される項目一覧の変化を監視したい。リストの ID を識別子としてグループに参加します。
例外メッセージは「System.InvalidOperationException
: ユーザー ID が認識されていません。アクティブな SignalR 接続中にユーザー ID を変更することはできません。」から来ていMicrosoft.AspNet.SignalR.PersistentConnection.GetConnectionId
ます。ソースを調べたところ、実際context.Request.User.Identity.Name
のものと接続トークンに保存されていたものを比較しています。それはすべて理にかなっていますが、私が探しているのは回避策です。
Microsoft.AspNet.SignalR 1.1.2を使用しています。