SignalR核心接收来自特定用户的消息

时间:2019-02-08 07:32:58

标签: c# .net-core signalr

SignalR内核是非常新的,因此文档中很少详细介绍如何使用它。 我已经完成了Microsoft的教程,并成功地向所有客户端发送了消息。现在,我要使用

发送给特定用户
public Task SendPrivateMessage(string user, string message, string to)
{
    return Clients.User(to).SendAsync("ReceiveMessage", user, message);
}

“ to”值是我从

获得的ConnectionID
public override Task OnConnectedAsync()
{
    Console.WriteLine("New ID Connected: " + Context.ConnectionId);
    return base.OnConnectedAsync();
}

这是我的客户:

public async void InitSignalRAsync()
{
    ChatMessage mess = new ChatMessage();
    hubConnection = new HubConnectionBuilder().WithUrl("http://localhost:5000/chatHub").Build();
    await hubConnection.StartAsync();
    hubConnection.On<string, string>("ReceiveMessage", async (user, message) =>
    {
        await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
        {
            mess.user = user;
            mess.message = message;
            Messages.Add(mess);
        });
    });
}


private void Send_Click(object sender, RoutedEventArgs e)
{
    hubConnection.InvokeAsync("SendPrivateMessage", User.Text, Text.Text, To.Text);
}

控制台没有记录任何错误,所以我猜它确实发送了,但是为什么我不能收到它?

1 个答案:

答案 0 :(得分:2)

要通过客户端的connectionId发送到客户端,应使用Clients.Client(coonectionId) ,Clients.User()用于通过用户ID向uniqe用户发送消息。通过用户ID发送消息,您可以尝试如下操作: -创建CustomUserIdProvider:

 public class CustomUserIdProvider: IUserIdProvider
{
    public virtual string GetUserId(HubConnectionContext connection)
    {
        //get current user id by httpcontext
    }
}

,然后在startup.cs中:

services.AddSignalR();
services.AddSignalRCore();

services.AddSingleton<IUserIdProvider, CustomUserIdProvider>();

现在在您的中心中,您可以按用户ID发送消息:

public void Send(string userId, string message)
{
    Clients.User(userId).send(message);
}

有关更多信息,请访问此link