我已经建立了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()函数时会引发异常。
看起来好像当前都不可能。到目前为止,我只是使用了强制的方式,希望这是暂时的。
我已经为集线器创建并使用了以下基类:
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);
}
}
GlobalHost不见了。您需要像在IHubContext<THub>
这可能是SignalR alpha1中的错误。您可以在https://github.com/aspnet/signalr上提出问题并提供简化的复制吗?