Clients.Caller и Clients.Client (ConnectionId) отправляет сообщение клиенту, но не client.Users (usersId) на собственном сервере SignalR - PullRequest
0 голосов
/ 14 января 2020

У меня есть сервер SignalR, который размещается как консольное приложение, как показано ниже, и когда я вызываю сервер с клиента (приложение для настольного компьютера), все вызовы выполняются в функции концентратора SignalR. Также, когда я хочу уведомить клиента как Clients.All или Clients.Caller, он уведомляет об этом всех клиентов, но когда я хочу уведомить определенного клиента, например Clients.user(UserId), в этом случае он не уведомляет клиента с помощью сообщения. .

Код сервера:

class Program
{
    static void Main(string[] args)
    {
        string url = @"http://+:8080/";
        using (WebApp.Start<StartUp>(url))
        {
            Console.WriteLine(string.Format("Server running at {0}", url));
            Console.ReadLine();
        }
    }
}

Ниже приведен код, как я хочу уведомить конкретного пользователя / клиента:

Clients.User(destinationUser.Oid.ToString()).ReceiveMessage(new ChatReceiveMessage
{
    ChatSourceType = ChatSourceType.User,
    Message = message,
    SourceUserFullName = chatuserSource.FullName,
    SourceUserNameId = chatuserSource.FullName,
    SourceUserId = chatuserSource.Oid,
    TargetedUserOrGroupId = chatuserSource.Oid,
    MessageThreadId = chatMessage.Oid,
});

И вот я создаю прокси в клиенте для вызова сервера:

IHubProxy _hub;
TaskScheduler uiTaskScheduler;
string url = @"http://*:8080/"; * is machine name
var connection = new HubConnection(url);
_hub = connection.CreateHubProxy("ChatHub");
connection.Start().Wait();
_hub.On("ReceiveMessage", message => Task.Factory.StartNew(() =>
{
    var obj = JsonConvert.DeserializeObject<ChatReceiveMessage>(message.ToString());
    listBoxMessages.Items.Add(obj.SourceUserFullName +" : "+ obj.Message);
    txtMessage.Text = "";
}, CancellationToken.None, TaskCreationOptions.None, uiTaskScheduler));

var row = OnlineUsersGrid.SelectedRows[0];
if (row == null) return;
var selectedRow = ((ChatAvailableUserOrGroup)row.DataBoundItem);
_hub.Invoke("SendPrivateMessage", ConnectionId, selectedRow.UserOrGroupId, txtMessage.Text, new Guid(SecuritySystem.CurrentUserId.ToString()));
...