使用 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() 函数时会抛出异常。
GlobalHost 不见了。您需要像 this sample.
中那样注入 IHubContext<THub>
这可能是 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);
}
}
我已经建立了一个 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() 函数时会抛出异常。
GlobalHost 不见了。您需要像 this sample.
中那样注入 这可能是 SignalR alpha1 中的错误。您可以在 https://github.com/aspnet/signalr 上提交问题并包含简化的重现吗?
IHubContext<THub>
好吧,目前看来两者都不可能。截至目前,我只是使用了一种希望是暂时的强制方式。
我已经为集线器创建并使用了以下基础 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);
}
}