2017-04-07 171 views
1

我创建了一个SignalR项目。想要像基本的WhatsApp应用程序。我可以使用SignalR向所有客户端发送消息,但我无法将消息发送给特定用户。SignalR发送消息给特定用户

这是我试过的。

服务器端

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     app.MapSignalR(); 
    } 
} 

public class ChatHub : Hub 
{ 
    public static string UserName = ""; 
    public void Send(string User, string Message) 
    { 
     //It doesn't works 
     Clients.User(UserName).sendMessage(Message); 
     //It works 
     Clients.All.sendMessage(Message); 
    } 
    public override Task OnConnected() 
    { 
     //It works I get the UserName 
     UserName = Context.QueryString["UserName"]; 
     return base.OnConnected(); 
    } 
} 

客户端

protected override async void OnAppearing() 
{ 
    chatHubConnection = new HubConnection("http://192.168.2.2:80/", new Dictionary<string, string>{ 
     { "UserName", myUser } 
    }); 
    chatHubProxy = chatHubConnection.CreateHubProxy("ChatHub"); 
    chatHubProxy.On<string>("sendMessage", (k) => { 
     Messages.Add(string.Format("Msg:{0}", k)); 
    }); 
    await chatHubConnection.Start(); 
} 
private async void SendButton_Clicked(object sender, EventArgs e) 
{ 
    await chatHubProxy.Invoke<string>("Send", recieverEntry.Text, messageEntry.Text); 
} 
+0

这里,您一看? http://stackoverflow.com/questions/19522103/signalr-sending-a-message-to-a-specific-user-using-iuseridprovider-new-2-0 – Ric

+0

但你的'用户名'是静态的,所以它会(假设它可以工作)保存最后一个连接用户的名字,我不认为这是你的期望。 – Evk

+0

@Evk是的,我知道它,我创建它来测试代码。 – Guest

回答

1

使用的ConnectionId要发送消息给特定的客户端。用户名和用户名是不同的东西,更多的细节 - https://docs.microsoft.com/en-us/aspnet/signalr/overview/guide-to-the-api/mapping-users-to-connections

代码更改为以下(理想情况下该连接字典应该提取作为单独的类来处理用户名来连接映射)

public class ChatHub : Hub 
{ 
    public static ConcurrentDictionary<string, string> Connections = new ConcurrentDictionary<string, string>(); 
    public void Send(string username, string message) 
    { 
     string connectionToSendMessage; 
     Connections.TryGetValue(username, out connectionToSendMessage); 

     if (!string.IsNullOrWhiteSpace(connectionToSendMessage)) 
     { 
      Clients.Client(connectionToSendMessage).SendMessage(message); 
     } 
    } 
    public override Task OnConnected() 
    { 
     if (!Connections.ContainsKey(Context.ConnectionId)) 
     { 
      Connections.TryAdd(Context.QueryString["UserName"], Context.ConnectionId); 
     } 

     return base.OnConnected(); 
    } 
} 
+0

感谢您的回复。但是最后一个用户不是我想要发送消息的用户。 – Guest

+1

@Guest您可以将消息发送给任何用户,但是您需要该用户的connectionId。您当前的代码存在的问题是,您使用的是用户名。首先问题,该函数期望UserId(不是用户名)。其次,如果您没有userId,则可以在客户端 – Kaushal

+1

@Guest上使用ConnectionId,将用户映射到连接。选项来做到这一点https://docs.microsoft.com/en-us/aspnet/signalr/overview/guide-to-the-api/mapping-users-to-connections – Kaushal

相关问题