しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

SignalR の IDisconnect には注意

こんばんは。相変わらず仕事で 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 プロパティを見るようにしましょう。