Ya no tienes que indagar más en internet porque estás al sitio correcto, poseemos la respuesta que deseas y sin liarte.
Solución:
Parece que finalmente lo he encontrado. El problema probablemente se debió a una identificación incorrecta, así que comencé a buscar una solución. Una publicación (https://github.com/aspnet/SignalR/issues/2200) me guió al uso de grupos, que parece la solución recomendada en estos casos. Entonces, cambié mi concentrador para que asigne automáticamente la ID de conexión actual a un grupo de “progreso”:
public sealed class ProgressHub : Hub
public const string GROUP_NAME = "progress";
public override Task OnConnectedAsync()
// https://github.com/aspnet/SignalR/issues/2200
// https://docs.microsoft.com/en-us/aspnet/signalr/overview/guide-to-the-api/working-with-groups
return Groups.AddToGroupAsync(Context.ConnectionId, "progress");
Ahora, mi método de controlador API es:
[HttpGet("lengthy")]
public async Task Lengthy()
await _progressHubContext
.Clients
.Group(ProgressHub.GROUP_NAME)
.SendAsync("taskStarted");
for (int i = 0; i < 100; i++)
Thread.Sleep(200);
Debug.WriteLine($"progress=i + 1");
await _progressHubContext
.Clients
.Group(ProgressHub.GROUP_NAME)
.SendAsync("taskProgressChanged", i + 1);
await _progressHubContext
.Clients
.Group(ProgressHub.GROUP_NAME)
.SendAsync("taskEnded");
return Ok();
Y, por supuesto, actualicé el código del cliente en consecuencia, para que ya no tenga que enviar una identificación al invocar el método API.
Repositorio de demostración completo disponible en https://github.com/Myrmex/signalr-notify-progress.
Recuerda que tienes autorización de interpretar si diste con la solución.