我正在尝试使用SignalR向所有连接的客户端发送消息。
我找到了几个例子,并添加了我认为所有必需的位。我成功地让我的客户端连接到我的Hub。我无法让我的服务器连接到我的Hub并向所有连接的客户端发送消息。
当我调用DatabaseChangeListener :: Notify()时,它永远不会访问集线器中的代码。
有人可以建议我还需要做什么吗?
我在使用React和Redux的Web应用程序中使用.NET Core 2.1预览版。
我正在使用SignalR 1.0.0-preview2-final
我正在使用SignalR.Client 1.0.0-preview2-final
在Startup.cs
中 public void ConfigureServices(IServiceCollection services)
{
// remove all other code for this question
services.AddSignalR();
}
public void Configure(IApplicationBuilder app)
{
// remove all other code for this question
app.UseSignalR(routes =>
{
routes.MapHub<SignalRHub>("/hubs/update");
});
}
我的中心
[Authorize]
public class SignalRHub : Hub
{
public async Task Send(string message)
{
await Clients.All.SendAsync("SendMessage", Context.User.Identity.Name, message);
}
}
我的班级通知客户
public class DatabaseChangeListener : IDatabaseChangeListener
{
private readonly IHubContext<SignalRHub> _hubContext;
public DatabaseChangeListener(IHubContext<SignalRHub> hubContext)
{
_hubContext = hubContext;
}
public void Notify()
{
_hubContext.Clients.All.SendAsync("SendMessage", "something changed, Yo");
}
}
答案 0 :(得分:0)
您需要通过客户端与集线器建立连接,然后使用_hubContext,您应该能够基于与集线器的连接向客户端发送消息。
使用JS从客户端连接到集线器。
const connection = new signalR.HubConnectionBuilder()
.withURL("/YourHub")
.build();
然后,在建立连接之后,您还可以使该方法也可以使用JS从服务器向客户端发送消息。
connection.on("SendMessage", message => {
document.getElementById("IdOfElementToDisplayMessage").innerHTML = message;
});
最后添加:
connection.start().catch(err => console.error(err.toString()));
现在,您已经通过客户端建立了到集线器的连接,现在可以从IHubContext引用到集线器的连接。
要将消息从服务器发送到客户端,可以使用_hubContext
。
在您的情况下,您可以先调用Notify()
,然后再调用await _hubContext.Clients.All.SendAsync("SendMessage", "something changed, Yo");
,这会将您的消息发送到JS中创建的SendMessage方法:connection.on("SendMessage", message => { ...
如果您的_hubContext
变量在执行期间为null,则需要检查IHubContext的注入。