public override async Task ReceiveBinaryAsync(WebSocket socket, WebSocketReceiveResult result, BinaryMessage receivedMessage) { if (!AbpSession.UserId.HasValue) { throw new AbpException("未登录,请先登录。"); } switch (receivedMessage.CommandType) { case CommandType.Typing: var typingInput = receivedMessage.DeserializeFromBytes <TypingInput>(); break; case CommandType.SendMessage: { var messageInput = receivedMessage.DeserializeFromBytes <SendMessageModel>(); await chatAppService.SendMessage(new SendMessageInput { SessionId = messageInput.SessionId, Message = messageInput.Message, UserId = AbpSession.GetUserId(), SenderName = AbpSession.FullName }); } break; case CommandType.GetMessage: { ChatMessageOutput[] list = null; var getMessageInput = receivedMessage.DeserializeFromBytes <GetMessageInput>(); var lastId = await chatAppService.GetLastReceivedMessageId(new ChatSessionInputBase { SessionId = getMessageInput.SessionId, UserId = AbpSession.GetUserId() }); var oldLastId = lastId; do { var messages = await chatAppService.GetMessages(new GetMessagesInput { MaxResultCount = getMessageInput.MaxCount, SkipCount = 0, LastReceivedMessageId = lastId, SessionId = getMessageInput.SessionId, UserId = AbpSession.GetUserId(), Direction = getMessageInput.Direction, Sorting = "Id " + (getMessageInput.Direction == QueryDirection.New ? "asc" : "desc") }); if (getMessageInput.Direction == QueryDirection.History) { list = messages.Items.OrderBy(msg => msg.Id) .Select(msg => _objectMapper.Map <ChatMessageOutput>(msg)) .ToArray(); } else { list = messages.Items .Select(msg => _objectMapper.Map <ChatMessageOutput>(msg)) .ToArray(); } if (list.Length > 0) { await socket.SendMsgPackAsync(CommandType.GetMessage, list); lastId = getMessageInput.Direction == QueryDirection.New ? list.Max(x => x.Id) : list.Min(x => x.Id); } else { break; } } while (getMessageInput.Loop); if (lastId > oldLastId) { await chatAppService.SetLastReceivedMessageId(new SetLastReceivedIdInput { SessionId = getMessageInput.SessionId, UserId = AbpSession.GetUserId(), LastReceivedMessageId = lastId }); } } break; case CommandType.PinMessageToTop: var pinMessageToTopInput = receivedMessage.DeserializeFromBytes <PinMessageToTopInput>(); break; case CommandType.UnpinMessageFromTop: var unpinMessageFromTopInput = receivedMessage.DeserializeFromBytes <UnpinMessageFromTopInput>(); break; case CommandType.ReadMessage: var readMessageInput = receivedMessage.DeserializeFromBytes <ReadMessageInput>(); break; case CommandType.CreatePrivateSession: { var createPrivateInput = receivedMessage.DeserializeFromBytes <Dto.Input.CreatePrivateSessionInput>(); if (createPrivateInput.TargetUserId != AbpSession.GetUserId()) { await chatAppService.CreatePrivateSession(new Dto.CreatePrivateSessionInput { CreatorTenantId = AbpSession.TenantId, CreatorUserId = AbpSession.GetUserId(), TargetUserId = createPrivateInput.TargetUserId, TargetTenantId = createPrivateInput.TargetTenantId }); var dtos = await GetSessions(AbpSession.ToUserIdentifier()); await socket.SendMsgPackAsync(CommandType.GetSessions, dtos); } else { throw new UserFriendlyException("不能跟自己发起对话。"); } } break; case CommandType.CreatePublicSession: { var createGroupInput = receivedMessage.DeserializeFromBytes <Dto.Input.CreatePublicSessionInput>(); await chatAppService.CreatePublicSession(new Dto.CreatePublicSessionInput { SessionName = createGroupInput.SessionName, CreatorTenantId = AbpSession.TenantId, CreatorUserId = AbpSession.GetUserId() }); var dtos = await GetSessions(AbpSession.ToUserIdentifier()); await socket.SendMsgPackAsync(CommandType.GetSessions, dtos); } break; case CommandType.DeleteSession: var deleteGroupInput = receivedMessage.DeserializeFromBytes <Dto.Input.DeleteSessionInput>(); await chatAppService.DeleteSession(new Dto.DeleteSessionInput { SessionId = deleteGroupInput.SessionId, UserId = AbpSession.GetUserId() }); //TODO 通知群组成员 break; case CommandType.JoinSession: var joinGroupInput = receivedMessage.DeserializeFromBytes <JoinSessionInput>(); break; case CommandType.LeaveSession: var leaveGroupInput = receivedMessage.DeserializeFromBytes <LeaveSessionInput>(); break; case CommandType.GetSessions: { var dtos = await GetSessions(AbpSession.ToUserIdentifier()); await socket.SendMsgPackAsync(CommandType.GetSessions, dtos); } break; case CommandType.GetSessionUnread: { var getGroupUnreadInput = receivedMessage.DeserializeFromBytes <GetSessionUnreadInput>(); var count = await chatAppService.GetSessionUnread(new ChatSessionInputBase { SessionId = getGroupUnreadInput.SessionId, UserId = AbpSession.GetUserId() }); var output = new SessionUnreadOutput { Count = count }; await socket.SendMsgPackAsync(CommandType.GetSessionUnread, output, httpContextAccess.HttpContext.RequestAborted); } break; case CommandType.PinToTop: var pinToTopInput = receivedMessage.DeserializeFromBytes <PinToTopInput>(); break; case CommandType.UnpinFromTop: var unpinFromTopInput = receivedMessage.DeserializeFromBytes <UnpinFromTopInput>(); break; case CommandType.BlockUser: var blockUserInput = receivedMessage.DeserializeFromBytes <BlockUserInput>(); break; case CommandType.UnblockUser: var unblockUserInput = receivedMessage.DeserializeFromBytes <UnblockUserInput>(); break; case CommandType.UploadFile: var uploadFileInput = receivedMessage.DeserializeFromBytes <UploadFileInput>(); break; case CommandType.DownloadFile: var downloadFileInput = receivedMessage.DeserializeFromBytes <DownloadFileInput>(); break; case CommandType.GetOnlineUsers: { var onlineUsers = GetOnlineUsers(); await socket.SendMsgPackAsync(CommandType.GetOnlineUsers, onlineUsers, httpContextAccess.HttpContext.RequestAborted); } break; default: break; } }