Я застрял здесь на пару дней. Я использую модель личности и контрагента, чтобы вручную отслеживать идентификаторы подключений. все работает, ожидайте, что указанный пользователь не получает сообщение. Я пытаюсь отправить сообщения указанным c людям через asp. net core и signalR мои модели:
public class Message
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public string MessageId { get; set; }
public string MessageTo { get; set; }
public string MessageFrom { get; set; }
public string MessageText { get; set; }
public bool MessageIsSent { get; set; }
}
public class ConTracker
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public string TrackerId { get; set; }
public IdentityUser identityUser { get; set; }
public string connectionId { get; set; }
}
, вот мой класс концентратора:
public class ChatHub : Hub
{
private readonly UserManager<IdentityUser> _usermanager;
private readonly ApplicationDbContext _context;
public ChatHub(ApplicationDbContext context, UserManager<IdentityUser> userManager)
{
_usermanager = userManager;
_context = context;
}
public async Task SendMessage(string userto,string userfrom,string message)
{
var curruser = await _usermanager.FindByNameAsync(userto);
var track = _context.conTrackers.Where(a => a.identityUser == curruser).FirstOrDefault();
bool isuserconnected = track == null ? false : true;
var msg = new Message()
{
MessageTo = userto,
MessageFrom = userfrom,
MessageText = message,
MessageIsSent = false
};
if (isuserconnected)
{
await Clients.Client(track.connectionId).SendAsync("ReceiveMessage", msg);
msg.MessageIsSent = true;
}
_context.messages.Add(msg);
_context.SaveChanges();
}
public void OnConnection()
{
var curruser = _context.Users.Where(a => a.Email == Context.User.Identity.Name).FirstOrDefault();
_context.conTrackers.Add(new ConTracker() { identityUser = curruser, connectionId = Context.ConnectionId });
_context.SaveChanges();
}
public async Task OnDisconnection()
{
var curruser = await _usermanager.FindByNameAsync(Context.User.Identity.Name);
var track = _context.conTrackers.Where(a=>a.identityUser==curruser).FirstOrDefault();
_context.conTrackers.Remove(track);
_context.SaveChanges();
}
}
Ниже мой сценарий:
"use strict";
var connection = new signalR.HubConnectionBuilder()
.withUrl("/chatHub").build();
document.getElementById("sendbtn").disabled = false;
connection.on("ReceiveMessage", function (rmsg) {
console.log("Message recieved-" + rmsg.messageText.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">"));
var msg = rmsg.messageText.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
var encodedmsg = rmsg.messageFrom + " says, " + msg+", to "+rmsg.messageTo;
var li = document.createElement("li");
li.textContent = encodedmsg;
document.getElementById("messages").appendChild(li);
});
connection.start().then(function () {
console.log("connection starting.");
connection.invoke("OnConnection");//, function (rslt) { if (rslt) { console.log("user added in contracker.") } else { console.log("tracker could not add user.") } }).catch(function (err) { return console.log(err.message);});
console.log("connection started.");
}).catch(function (err) {
return console.error(err.toString())
});
document.getElementById("sendbtn").addEventListener("click", function (event) {
var userto = document.getElementById("userto").value;
var userfrom = document.getElementById("userfrom").value;
var message = document.getElementById("msg").value;
//console.log(userfrom + "-" + userto + "-" + message);
connection.invoke("SendMessage", userto, userfrom, message).catch(function (err) {
return console.error(err.toString());
});
event.preventDefault();
});
Я вручную управляю своими идентификаторами подключения с пользователями. Я пробовал использовать Clients.User (User.Identity.Name), но ничего не работает. любезно помогите