отправка указанного c пользователя через signalr - PullRequest
0 голосов
/ 05 мая 2020

Я застрял здесь на пару дней. Я использую модель личности и контрагента, чтобы вручную отслеживать идентификаторы подключений. все работает, ожидайте, что указанный пользователь не получает сообщение. Я пытаюсь отправить сообщения указанным 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, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;"));
    var msg = rmsg.messageText.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
    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), но ничего не работает. любезно помогите

...