sudip chand
sudip chand

Reputation: 265

SignalR Hub OnDisconnectedAsync Method Does Not Get Hit in Blazor Server

Here I am trying to remove ConnectionId from connected connectedId list UserHandler.ConnectedUser in OnDisconnectedAsync method of my hub.
But the problem is that when ever user gets logout from application or close that window the OnDisconnectedAsync method on hub does not get hit.


Any help with my code will be grate. Thank you.

Below is my hub

public class ChatHub : Hub
{
    public List<string> SendingUserList = new List<string>();
    public async Task SendMessage(string to, string message)
    {
        var senderConnectionId = Context.ConnectionId;
        SendingUserList.Add(to);
        SendingUserList.Add(senderConnectionId);
        foreach (var connectionId in SendingUserList)
        {
            await Clients.Client(connectionId).SendAsync("ReceiveMessage", message);
        }
    }
    public override Task OnConnectedAsync()
    {
        Clients.All.SendAsync("ReciveUser", UserHandler.UserName, Context.ConnectionId);
        return base.OnConnectedAsync();
    }
    public override async Task OnDisconnectedAsync(Exception e)
    {
        UserHandler.ConnectedUser.Remove(Context.ConnectionId));
        await base.OnDisconnectedAsync(e);
    }      
}
public static class UserHandler
{
    public static HashSet<string> ConnectedUser = new HashSet<string>();
    public static string UserName { get; set; }
}



Below is my remaining code

    protected override async Task OnInitializedAsync()
    {
        UserHandler.UserName = httpContextAccessor.HttpContext.User.Identity.Name;
        hubConnection = new HubConnectionBuilder()
            .WithUrl(NavigationManager.ToAbsoluteUri("/chathub"))
            .Build();
        hubConnection.ServerTimeout = TimeSpan.FromMinutes(60);
        hubConnection.On<string>("ReceiveMessage", BroadcastMessage);
        hubConnection.On<string,string>("ReciveUser", RefreshUserList);

        await hubConnection.StartAsync();

        StateHasChanged();
    }
    private void RefreshUserList(string connectedUserId, string connectionId )
    {
        UserHandler.ConnectedUser.Add(connectionId);
        connectedUserList = UserHandler.ConnectedUser;
        StateHasChanged();
    }
    private void BroadcastMessage(string message)
    {
        var encodedMsg = $"{message}";
        messages.Add(encodedMsg);
        StateHasChanged();
    }
    public async ValueTask DisposeAsync()
    {
        await hubConnection.DisposeAsync();
    }

Upvotes: 1

Views: 2150

Answers (1)

enet
enet

Reputation: 45596

You'll need to implement the IAsyncDisposable interface in the Hub's consumer (Razor Component), like this:

@implements IAsyncDisposable

Add these methods:

public void Dispose()
    {
       
        hubConnection.DisposeAsync();
    }

    public async ValueTask DisposeAsync()
    {
        await hubConnection.DisposeAsync();
    }

Now, when you close the client's page the OnDisconnectedAsync method will be called.

Upvotes: 4

Related Questions