使用 signalR .net 核心客户端

using signalR .net core client

我已经建立了一个 signalR 网站 .net 核心。我在中心的职能是:

public async Task Notify(int id) {
    await Clients.All.InvokeAsync("Notified", id);
}

我也用下面的js测试过这个:

let connection = new signalR.HubConnection(myURL);

    connection.on('Notified', data => {
        console.log(4, data);
    });

    connection.start();

js 代码似乎工作正常,我在尝试时看到了日志 connection.Invoke('Notify')

现在我有一个控制台应用程序需要进行调用。我正在以两种方式尝试这个并且不介意任何一种解决方案: 1. signalR 网站中的一个 mvc 控制器,可以获取 id 并调用 'Notified'。 2. 在控制台应用程序中使用客户端库 Microsoft.AspNetCore.SignalR.Client

方法1我在经典asp.net中只做过这样的:

GlobalHost.ConnectionManager.GetHubContext(hubName)

但是找不到在 .net core 中执行此操作的方法。

Way 2 到目前为止,我已经使用了这个库并尝试过这个:

var con = new HubConnectionBuilder();
con.WithUrl(myURL);      
var connection = con.Build();
connection.InvokeAsync("Notify",args[0]).Wait();

这是我目前最接近js代码创建连接的方式了。然而,这段代码在调用 connection.InvokeAsync 时抛出一个空指针。 connection 对象不为空。它似乎是一个为空的内部对象。根据堆栈跟踪,在内部调用 MoveNext() 函数时会抛出异常。

  1. GlobalHost 不见了。您需要像 this sample.

  2. 中那样注入 IHubContext<THub>
  3. 这可能是 SignalR alpha1 中的错误。您可以在 https://github.com/aspnet/signalr 上提交问题并包含简化的重现吗?

好吧,目前看来两者都不可能。截至目前,我只是使用了一种希望是暂时的强制方式。

我已经为集线器创建并使用了以下基础 class:

public abstract class MyHub : Hub
{

    private static Dictionary<string, IHubClients> _clients = new Dictionary<string, IHubClients>();

    public override Task OnConnectedAsync()
    {
        var c = base.OnConnectedAsync();
        _clients.Remove(Name);
        _clients.Add(Name, Clients);
        return c;
    }

    public static IHubClients GetClients(string Name) {
        return _clients.GetValueOrDefault(Name);
    }
}