SignalR 客户端 (Xamarin) 在发送给特定用户时没有收到消息
SignalR client (Xamarin) doesn't get messages when sending to a specific user
我的问题是:
我有一个 WPF 应用程序和一个 Xamarin Forms 应用程序。我想创建一个聊天。当我从 WPF 调用一个应该向每个用户发送消息的方法时,它就起作用了。但是当我选择特定用户时却没有。在这种情况下,不会触发 Xamarin 站点上的 "On" 方法。可能我在记录用户时搞砸了。这是我的代码。
Xamarin
var hubConnection = new HubConnection("my_url");
hubConnection.Headers.Add("login", CacheUtils.User.login);
ChatHubProxy = hubConnection.CreateHubProxy("ChatHub");
await hubConnection.Start();
ChatHubProxy.On<string, string>("UpdateChatMessage", (message, username) =>
{
Device.BeginInvokeOnMainThread(() =>
{
MessagingCenter.Send(this, "AddMessage", new Message() { Text = message, User = username });
});
});
string lConnectionId = await ChatHubProxy.Invoke<string>("Login");
hubConnection.ConnectionId = lConnectionId;
所以我基本上创建了一个连接并订阅了一个 "On" 方法。在 header 中,我传递了一个用户登录名。正如我在接收消息之前所说的那样,当消息是给每个人的时候。
在服务器端,我首先调用方法 "Login" 将用户添加到我的 ConcurrentDictionary。然后在一个方法 "SendMessageToSpecificUser" 中,我从我称之为 "UpdateChatMessage" 的字典中获取用户。
服务器端
private static ConcurrentDictionary<string, string> clients = new ConcurrentDictionary<string, string>();
public void SendMessage(string message, string username)
{
Clients.All.UpdateChatMessage(message, username); //this works
}
public void SendMessageToSpecificUser(string message, string login)
{
string lUserId = clients.Where(x => x.Value == login).FirstOrDefault().Key;
if (!string.IsNullOrEmpty(lUserId))
Clients.User(lUserId).UpdateChatMessage(message, login); //this doesn't work
}
public string Login()
{
string username = Context.Headers.Get("login");
if (clients.ContainsKey(username))
((IDictionary)clients).Remove(username);
clients.TryAdd(Context.ConnectionId, username);
return Context.ConnectionId;
}
感谢任何帮助:)
好的,我找到了解决方案。我应该使用:
Clients.Client(lUserId).UpdateChatMessage(message, login);
而不是
Clients.User(lUserId).UpdateChatMessage(message, login);
我的问题是: 我有一个 WPF 应用程序和一个 Xamarin Forms 应用程序。我想创建一个聊天。当我从 WPF 调用一个应该向每个用户发送消息的方法时,它就起作用了。但是当我选择特定用户时却没有。在这种情况下,不会触发 Xamarin 站点上的 "On" 方法。可能我在记录用户时搞砸了。这是我的代码。
Xamarin
var hubConnection = new HubConnection("my_url");
hubConnection.Headers.Add("login", CacheUtils.User.login);
ChatHubProxy = hubConnection.CreateHubProxy("ChatHub");
await hubConnection.Start();
ChatHubProxy.On<string, string>("UpdateChatMessage", (message, username) =>
{
Device.BeginInvokeOnMainThread(() =>
{
MessagingCenter.Send(this, "AddMessage", new Message() { Text = message, User = username });
});
});
string lConnectionId = await ChatHubProxy.Invoke<string>("Login");
hubConnection.ConnectionId = lConnectionId;
所以我基本上创建了一个连接并订阅了一个 "On" 方法。在 header 中,我传递了一个用户登录名。正如我在接收消息之前所说的那样,当消息是给每个人的时候。 在服务器端,我首先调用方法 "Login" 将用户添加到我的 ConcurrentDictionary。然后在一个方法 "SendMessageToSpecificUser" 中,我从我称之为 "UpdateChatMessage" 的字典中获取用户。
服务器端
private static ConcurrentDictionary<string, string> clients = new ConcurrentDictionary<string, string>();
public void SendMessage(string message, string username)
{
Clients.All.UpdateChatMessage(message, username); //this works
}
public void SendMessageToSpecificUser(string message, string login)
{
string lUserId = clients.Where(x => x.Value == login).FirstOrDefault().Key;
if (!string.IsNullOrEmpty(lUserId))
Clients.User(lUserId).UpdateChatMessage(message, login); //this doesn't work
}
public string Login()
{
string username = Context.Headers.Get("login");
if (clients.ContainsKey(username))
((IDictionary)clients).Remove(username);
clients.TryAdd(Context.ConnectionId, username);
return Context.ConnectionId;
}
感谢任何帮助:)
好的,我找到了解决方案。我应该使用:
Clients.Client(lUserId).UpdateChatMessage(message, login);
而不是
Clients.User(lUserId).UpdateChatMessage(message, login);