こんばんは。相変わらず仕事で SignalR を弄りまくって、iPhone アプリから SignalR の API 叩いたりして遊んでます。
SignalR はクライアントの接続毎に GUID 形式で ID が振られるようになっているんですが、この ID は何処かに保存しておかないと困るケースが多いです。サンプル程度ならいいんですけど、実用できるようなアプリになると 1 アカウントで複数の接続とかざらにあるので。
で、今日は Hub に IDisconnect を実装して、コネクションが切断された時に保存してある ID を削除する処理を以下のように書いたのですが、どうもうまくいきませんでした。
public Task Disconnect() { // ログイン済みか確認する if (Context.User != null) { // ログイン済みならユーザーを取得して ID を削除 var user = _userRepository.Find(Context.User.Identity.Name); user.Connections.Remove(Context.ConnectionId); } return null; }
まあ、多少端折りましたけどこんな感じです。フォーム認証を使ってユーザー管理を実装していたので Context.User を使ってログイン済みか確認していましたが、調べてみると Context.User や Context.RequestCookies は Disconnect メソッド内では常に null になります。
つまり、修正するとなると ID から関連付いているユーザーを取得して、それから ID を削除するという処理にする必要があります。
ちなみに Context.User はログインされていない時にでも null にはなりません。IIdentity.IsAuthenticated プロパティを見るようにしましょう。