0

我已经建立了一个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 并调用“通知”。Microsoft.AspNetCore.SignalR.Client2.在控制台应用程序中使用客户端库。

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

GlobalHost.ConnectionManager.GetHubContext(hubName)

但是在.net core中找不到这样做的方法。

方式2我已经使用了该库并尝试了这个到目前为止:

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

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

4

2 回答 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);
    }
}
于 2017-09-21T17:50:41.070 回答
0
  1. GlobalHost 不见了。您需要IHubContext<THub>此示例中一样注入。

  2. 这可能是 SignalR alpha1 中的错误。您可以在https://github.com/aspnet/signalr上提出问题并包含简化的重现吗?

于 2017-09-21T01:31:50.120 回答