首页 > 解决方案 > 从.net core SignalR接收两条消息并做出反应

问题描述

我正在尝试使用 .net SignalR 和 React 应用程序作为客户端设置 WebSocket 连接,以便能够发送私人消息。

这是我在客户端的代码:

const setUpSignalRConnection = async () => {
    const connection = new HubConnectionBuilder()
      .withUrl("http://localhost:5000/messaginghub")
      .build();

    setConnection(connection);

    connection.on("ReceiveMessage", (message: string) => {
      console.log("Recieved Message", message);

      setChatMessages((oldArray) => [...oldArray, message]);
    });

    try {
      await connection.start();
    } catch (err) {
      console.log("Errors", err);
    }

    return connection;
  };


  const SendMessage = async () => {
    if (connection) {
      try {
        console.log("sending message");
        await connection.send("SendPrivateMessage", user.user.email, message);
      } catch (e) {
        console.log("Errors sending message", e);
      }
    } else {
      alert("No connection to server yet.");
    }
  };

和我的服务器端代码

       public async Task SendPrivateMessage(string userEmail, string message)
        {
            var RecivingMessageUser = _unitOfWork.UserRepository.GetByEmail(userEmail);

            var currUserEmail = Context.User.FindFirstValue(ClaimTypes.NameIdentifier);
            var sender = _unitOfWork.UserRepository.GetByEmail(currUserEmail);

            var newMessage = new MessagesDto
            {
                FromId = sender.UserId,
                ToId = RecivingMessageUser.UserId,
                MessageBody = message,
                SentAt = DateTime.UtcNow,
            };

            await Clients.Group(userEmail).SendAsync("ReceiveMessage", message);

            _unitOfWork.MessagingRepository.Insert(_mapper.Map<MessagesDto, Messages>(newMessage));
            _unitOfWork.SaveChanges();

        }

        public override Task OnConnectedAsync()
        {
            var groupName = Context.User.FindFirstValue(ClaimTypes.NameIdentifier);
            Groups.AddToGroupAsync(Context.ConnectionId, groupName);

            return base.OnConnectedAsync();
        }

        public override Task OnDisconnectedAsync(Exception ex)
        {
            Groups.RemoveFromGroupAsync(Context.ConnectionId, Context.User.FindFirstValue(ClaimTypes.NameIdentifier));

            return base.OnDisconnectedAsync(ex);
        }

使用console.logs,我看到我发送了一次消息,并且消息一次存储在数据库中,但不知何故,我收到了两条收到的消息。

我正在我的本地机器上用两个不同的浏览器对其进行测试。

我究竟做错了什么?

标签: c#.netreactjswebsocketsignalr

解决方案


您后端的哪个方法调用了两次?你告诉你的消息保存到数据库中一次,所以它不应该SendPrivateMessage是调用 towice 的方法。


推荐阅读