C# 信号器客户端(Xamarin)不';发送给特定用户时无法获取消息

C# 信号器客户端(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.

我的问题是: 我有一个WPF应用程序和一个Xamarin表单应用程序。我想创建一个聊天室。当我从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;
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)


嗨,很高兴找到了解决办法!请记住在可能的情况下标记此项。:-)