'.NET Framework SignalR Clients.Caller Not working as expected

I am currently using SignalR in my .NET framework project to send updates to the client for a long running process. There can be many processes running simultaneously and the client will subscribe to any one of the process using an unique ID. I am using Groups to identify the clients who are subscribed to a particular process. If a client subscribes to a process in middle, I must send all the previous messages to that client. The code goes something like this

public class ProgressHub : Hub
{
    public async Task SubscribeToProgress(string id)
    {
        foreach (var message in GetPreviousMessages(id)) // Getting all the previous messages
        {
            await Clients.Caller.SendMessage(message); // Sending Messages to the current caller alone
        }
        await Groups.Add(Context.ConnectionId, id); // Added the current client to a group to be used further
    }
}

The client listens to Send Message

The above code snippet is not working (No messages in the network tab). I tried many things

await Clients.Client(Context.ConnectionId).SendMessage(message);

await Clients.All.SendMessage(message); // Just to check if it works

all the above without await, but nothing seems to work.

After fiddling around a bit, I was able to come up with this

public class ProgressHub : Hub
{
    public async Task SubscribeToProgress(string id)
    {
        await Groups.Add(Context.ConnectionId, id); // Adding client to the group first
        foreach (var message in GetPreviousMessages(id))
        {
            await Clients.Group(id).SendMessage(message); // Sending messages to the group all together
        }
    }
}

But this has an undesirable side effect of sending the older messages to client who are already connected. Sure, I can exclude the other connectionIDs and send out the message, but this seems like an hack. Logically speaking, the first snippet should have worked just fine.



Solution 1:[1]

are you add configuration in Program.cs ?

using SignalRChat.Hubs;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddSignalR();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();
app.MapHub<ChatHub>("/chatHub");

app.Run();

and you can read this reference : Microsoft

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 mohammad asadi