Для всех, кто пытается сделать это в ядре asp.net. Вы можете использовать претензии.
public class CustomEmailProvider : IUserIdProvider
{
public virtual string GetUserId(HubConnectionContext connection)
{
return connection.User?.FindFirst(ClaimTypes.Email)?.Value;
}
}
Можно использовать любой идентификатор, но он должен быть уникальным. Например, если вы используете идентификатор имени, это означает, что если есть несколько пользователей с тем же именем, что и получатель, сообщение будет доставлено и им. Я выбрал электронную почту, потому что она уникальна для каждого пользователя.
Затем зарегистрируйте службу в классе запуска.
services.AddSingleton<IUserIdProvider, CustomEmailProvider>();
Следующий. Добавляйте претензии при регистрации пользователя.
var result = await _userManager.CreateAsync(user, Model.Password);
if (result.Succeeded)
{
await _userManager.AddClaimAsync(user, new Claim(ClaimTypes.Email, Model.Email));
}
Отправить сообщение конкретному пользователю.
public class ChatHub : Hub
{
public async Task SendMessage(string receiver, string message)
{
await Clients.User(receiver).SendAsync("ReceiveMessage", message);
}
}
Примечание. Отправитель сообщения не получит уведомления об отправке сообщения. Если вы хотите уведомление на стороне отправителя. Измените SendMessage
метод на этот.
public async Task SendMessage(string sender, string receiver, string message)
{
await Clients.Users(sender, receiver).SendAsync("ReceiveMessage", message);
}
Эти шаги необходимы только в том случае, если вам нужно изменить идентификатор по умолчанию. В противном случае перейдите к последнему шагу, где вы можете просто отправлять сообщения, передавая userIds или connectionIds в SendMessage
. Для большего