使用signalR .net核心客户端

问题描述 投票:0回答:2

我已经建立了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核心中找不到实现此目的的方法。

方法2到目前为止,我已使用该库并进行了尝试:

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

这是我用来创建连接的最接近方法,它与js代码相同。但是,此代码在调用connection.InvokeAsync时抛出空指针。 connection对象不为null。它似乎是一个内部对象,为null。根据堆栈跟踪,在内部调用MoveNext()函数时会引发异常。

asp.net-core-mvc signalr.client asp.net-core-2.0 asp.net-core-signalr
2个回答
1
投票

看起来好像当前都不可能。到目前为止,我只是使用了强制的方式,希望这是暂时的。

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

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);
    }
}

0
投票
  1. GlobalHost不见了。您需要像在IHubContext<THub>

  2. 中那样注入this sample.
  3. 这可能是SignalR alpha1中的错误。您可以在https://github.com/aspnet/signalr上提出问题并提供简化的复制吗?

© www.soinside.com 2019 - 2024. All rights reserved.