2017-04-07 170 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

相關問題