У меня есть сервер 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()));