Я пытаюсь создать проект SignalR .net core 3.0 с Angular в качестве клиентского приложения. Я установил успешное соединение между клиентом и сервером и отправляю сообщения всем подключенным клиентам. Я намерен отправлять сообщения конкретному пользователю, а не всем подключенным клиентам. Для этого я пытаюсь работать с ConnectionId, UserIdentifier и User.Identity.Name.
Мой серверный код/концентратор сообщений
namespace SignalR_server
{
public class MessageHub : Hub
{
public static ConcurrentDictionary<string, string> MyUsers = new ConcurrentDictionary<string, string>();
public override Task OnConnectedAsync()
{
string name = Context.User.Identity.Name;
MyUsers.TryAdd( Context.ConnectionId,name);
return base.OnConnectedAsync();
}
public override Task OnDisconnectedAsync(Exception exception)
{
string garbage;
MyUsers.TryRemove(Context.ConnectionId, out garbage);
return base.OnDisconnectedAsync(exception);
}
public void Send(string msg)
{
string strMessage = string.Empty;
Clients.All.SendAsync("transfermessage",strMessage);
}
public string GetConnectionID()
{
return Context.ConnectionId;
}
public string GetUserIdentifier()
{
return Context.UserIdentifier;
}
public string GetUserName()
{
return Context.User.Identity.Name;
}
public Task SendPrivateMessage(string user, string message)
{
return Clients.Users(user).SendAsync("transfermessage1", message);
}
}
}
Клиентская сторона/код Angular
public startConnection = () => {
this.hubConnection = new signalR.HubConnectionBuilder()
.withUrl('https://localhost:44363/message',{
skipNegotiation: true,
transport: signalR.HttpTransportType.WebSockets
})
.build();
this.hubConnection
.start()
.then(() => {
console.log('Connection Started')
console.log('Connection ID: ')
console.log(this.hubConnection.invoke("GetConnectionID"))
console.log('User Identifier: ')
console.log(this.hubConnection.invoke("GetUserIdentifier"))
console.log('User Name: ')
console.log(this.hubConnection.invoke("GetUserName"))
// console.log(this.hubConnection.invoke("SendPrivateMessage","Myuser","test message"))
})
.catch(err => console.log('Error while connecting: ' + err))
}
Всякий раз, когда подключается новый клиент, я вижу значение для connectionId
, но UserIdentifier
, User.Identity.Name
оказывается нулевым.
Я не уверен, почему это происходит; я что-то упустил или что-то нужно сделать, чтобы определить UserIdentifers?