0

Web プロジェクトにチャットを実装する必要があります。1 ページに実装する方法 - それに関する記事はたくさんあります。しかし、私には能力が必要です: 1.他のユーザーに、誰かがサイトにログインしたことを通知します(チャットページだけでなく、任意のページで) 2.他のユーザーに、誰かがログアウトしたことを通知します

したがって、ハブの次のコードがあります。

    public void Connect()
    {
        try
        {
            var id = Context.ConnectionId;
            string username = Context.User.Identity.Name;

            var currentUser = connectedUsers.Where(p => p.Username == username).FirstOrDefault();
            if (currentUser == null)
            {
                AddNewUserToCollection();
            }
            else
            {
                // update ConnectionId for sure (connection id is changed sometimes (probably if user is logged out and login again))
                if (currentUser.ConnectionId != id)
                {
                    var companyId = _chatRepository.GetCompanyIdOfUser(username); // throws exception if companyId is null
                    Groups.Remove(currentUser.ConnectionId, companyId.ToString());
                    Groups.Add(id, companyId.ToString());
                    currentUser.ConnectionId = id;
                    //Clients.Group(companyId.ToString()).onNewUserConnected(username);
                }
            }
        }
        catch(InvalidCompanyException c_ex)
        {
            Clients.Client(Context.ConnectionId).onErrorMessage($"User '{c_ex.Username}' does not exist");
        }
    }


    public void Disconnect()
    {
        string username = Context.User.Identity.Name;
        var item = connectedUsers.Where(p => p.Username == username).FirstOrDefault();
        if (item != null)
        {
            connectedUsers.Remove(item);
            Groups.Remove(item.ConnectionId, item.CompanyID.ToString());
            Clients.Group(item.CompanyID.ToString()).onUserDisconnected(item.Username);
        }
    }

    public override Task OnDisconnected(bool stopCalled)
    {
        var item = connectedUsers.Where(p => p.ConnectionId == Context.ConnectionId).FirstOrDefault();
        if (item != null)
        {
            connectedUsers.Remove(item);
            Groups.Remove(item.ConnectionId, item.CompanyID.ToString());
            Clients.Group(item.CompanyID.ToString()).onUserDisconnected(item.Username);
        }
        return base.OnDisconnected(stopCalled);
    }

そして、次のコードを _layout.cshtml に追加しました。

    <script>
        $(document).ready(function () {
            var chat = $.connection.chatHub;

            $.connection.hub.start().done(function () {
                chat.server.connect();
            });
        });
    </script>

現在のユーザーがログに記録されていることを他のユーザーに通知します。しかし、デバッガーは、ユーザーが異なる connectionId でページをリロードする (ページを通過する) ときに、そのペア OnDisconnected/Connect が毎回呼び出されると言います。このクライアント コードを削除すると、そのペアは呼び出されません。誰かがオンラインであることを他のユーザーに通知するために、それを正しく実装する方法はありますが、毎回再接続する必要はありませんか?

4

1 に答える 1