首页 > 解决方案 > SignalR 通过 IProgress从 js 客户端到集线器

问题描述

是否可以IProgress<T>从 js 客户端传递到 C# SignalR 集线器?我想做的是:

在集线器一侧:

public class ProgressHub : Hub<IProgressHub>
{
    public async Task Foo(string jobId, IProgress<int> progress)
    {
        Console.WriteLine($"Started monitoring {jobId}");

        for (int i = 0; i < 100; i++)
        {
            await Task.Delay(TimeSpan.FromSeconds(1)); // Simulate some work
            progress.Report(i);            
        }        
    }
}

public interface IProgressHub
{
    Task Foo(string jobId, Progress<int> progress);
}

在js方面:

connection
    .invoke("Foo", "this-is-job-id", progressPercentage => console.log(`Processed ${value}%`))
    .then(() => console.log("Processing done"));

信号器集线器上的方法被调用,但 IProgress 总是最终为空。

标签: javascriptc#signalrsignalr-hub

解决方案


我刚刚在 ASP.NET SignalR 和 ASP.NET Core SignalR 之间的差异中找到了答案

在客户端和集线器(通常称为 HubState)之间传递任意状态的能力已被删除,以及对进度消息的支持。目前没有集线器代理的对应物。

最后我决定做以下事情:

在集线器端:RegisterToProgress([...])它将在内部调用SendProgress([...])将向客户端发送消息。

在 js 客户端:调用RegisterToProgress和监听SendProgress消息。


推荐阅读