SignalR无法向所有连接的客户端发送消息

时间:2018-04-18 01:23:36

标签: signalr asp.net-core-2.0

我正在尝试使用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");
    }
}

1 个答案:

答案 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的注入。