C# 信号器客户端(Xamarin)不';发送给特定用户时无法获取消息
我的问题是: 我有一个WPF应用程序和一个Xamarin表单应用程序。我想创建一个聊天室。当我从WPF调用一个应该向每个用户发送消息的方法时,它就会工作。但当我选择一个特定的用户时,它不会。在这种情况下,不会触发Xamarin站点上的“On”方法。可能是我把用户的日志记录搞砸了。这是我的密码 XamarinC# 信号器客户端(Xamarin)不';发送给特定用户时无法获取消息,c#,asp.net,xamarin.forms,signalr,C#,Asp.net,Xamarin.forms,Signalr,我的问题是: 我有一个WPF应用程序和一个Xamarin表单应用程序。我想创建一个聊天室。当我从WPF调用一个应该向每个用户发送消息的方法时,它就会工作。但当我选择一个特定的用户时,它不会。在这种情况下,不会触发Xamarin站点上的“On”方法。可能是我把用户的日志记录搞砸了。这是我的密码 Xamarin var hubConnection = new HubConnection("my_url"); hubConnection.Headers.
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;
var-hubConnection=新的hubConnection(“我的url”);
添加(“login”,CacheUtils.User.login);
ChatHubProxy=hubConnection.CreateHubProxy(“ChatHub”);
等待连接。开始();
ChatHubProxy.On(“UpdateChatMessage”,(消息,用户名)=>
{
Device.beginInvokeMainThread(()=>
{
Send(这是“AddMessage”,newmessage(){Text=Message,User=username});
});
});
string lConnectionId=wait ChatHubProxy.Invoke(“Login”);
hubConnection.ConnectionId=lConnectionId;
所以我基本上创建了一个连接并订阅了一个“On”方法。在标题中,我传递了一个用户登录名。正如我之前所说的,当信息面向所有人时,接收信息是有效的。
在服务器端,我首先调用一个方法“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;
}
私有静态ConcurrentDictionary客户端=新建ConcurrentDictionary();
公共void发送消息(字符串消息、字符串用户名)
{
Clients.All.UpdateChatMessage(message,username);//这很有效
}
public void sendmagestospecificuser(字符串消息、字符串登录)
{
字符串lUserId=clients.Where(x=>x.Value==login.FirstOrDefault().Key;
如果(!string.IsNullOrEmpty(lUserId))
Clients.User(lUserId).UpdateChatMessage(message,login);//这不起作用
}
公共字符串登录()
{
字符串username=Context.Headers.Get(“login”);
if(clients.ContainsKey(用户名))
((IDictionary)客户端)。删除(用户名);
clients.TryAdd(Context.ConnectionId,用户名);
返回Context.ConnectionId;
}
感谢您的帮助:)好的,我找到了解决方案。我应该使用:
Clients.Client(lUserId).UpdateChatMessage(message,login)代码>
而不是
Clients.User(lUserId).UpdateChatMessage(message,login)代码>
嗨,很高兴找到了解决办法!请记住在可能的情况下标记此项。:-)