优化signalr消息发送接收

This commit is contained in:
不做码农 2023-09-27 18:28:03 +08:00
parent 31980c80bb
commit 945f64e46a
4 changed files with 59 additions and 21 deletions

View File

@ -3,7 +3,6 @@ using Infrastructure.Converter;
using Microsoft.AspNetCore.DataProtection;
using NLog.Web;
using System.Text.Json;
using System.Text.Json.Serialization;
using ZR.Admin.WebApi.Extensions;
using ZR.Common.Cache;
using ZR.Infrastructure.WebExtensions;

View File

@ -0,0 +1,31 @@
namespace ZR.ServiceCore.Model.Dto
{
public class ChatMessageDto
{
public ChatUserDto FromUser { get; set; }
public bool Self { get; set; }
[SugarColumn(IsPrimaryKey = true)]
public string ChatId { get; set; }
/// <summary>
/// 0、文本 1、图片 2、文件 3、语音 4、视频
/// </summary>
public int MsgType { get; set; }
public string StoredKey { get; set; }
public long UserId { get; set; }
public long ToUserId { get; set; }
/// <summary>
/// 消息内容如果type=1/2/3/4此属性表示文件的URL地址
/// </summary>
public string Message { get; set; }
public long ChatTime { get; set; }
public int Online { get; set; }
}
public class ChatUserDto
{
public string UserName { get; set; }
public string NickName { get; set; }
public string Avatar { get; set; }
}
}

View File

@ -1,10 +1,12 @@
using Infrastructure;
using Infrastructure.Model;
using IPTools.Core;
using Mapster;
using Microsoft.AspNetCore.SignalR;
using System.Web;
using UAParser;
using ZR.Service.System.IService;
using ZR.ServiceCore.Model.Dto;
namespace ZR.ServiceCore.Signalr
{
@ -18,10 +20,12 @@ namespace ZR.ServiceCore.Signalr
public static List<OnlineUsers> users = new();
//private readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
private readonly ISysNoticeService SysNoticeService;
private readonly ISysUserService UserService;
public MessageHub(ISysNoticeService noticeService)
public MessageHub(ISysNoticeService noticeService, ISysUserService userService)
{
SysNoticeService = noticeService;
UserService = userService;
}
private ApiResult SendNotice()
@ -137,12 +141,11 @@ namespace ZR.ServiceCore.Signalr
/// <summary>
/// 发送信息
/// </summary>
/// <param name="toConnectId">对方链接id</param>
/// <param name="toUserId"></param>
/// <param name="message"></param>
/// <returns></returns>
[HubMethodName("sendMessage")]
public async Task SendMessage(string toConnectId, long toUserId, string message)
public async Task SendMessage(long toUserId, string message)
{
var userName = HttpContextExtension.GetName(App.HttpContext);
long userid = HttpContextExtension.GetUId(App.HttpContext);
@ -150,28 +153,33 @@ namespace ZR.ServiceCore.Signalr
var toUserInfo = toUserList.FirstOrDefault();
IList<string> sendToUser = toUserList.Select(x => x.ConnnectionId).ToList();
sendToUser.Add(GetConnectId());
if (toUserInfo != null)
var fromUser = await UserService.GetByIdAsync(userid);
ChatMessageDto messageDto = new()
{
await Clients.Clients(sendToUser)
.SendAsync("receiveChat", new
{
msgType = 0,//文本
chatid = Guid.NewGuid().ToString(),
userName,
userid,
toUserName = toUserInfo.Name,
toUserid = toUserInfo.Userid,
message,
chatTime = DateTime.Now
});
}
else
MsgType = 0,
StoredKey = $"{userid}-{toUserId}",
UserId = userid,
ChatId = Guid.NewGuid().ToString(),
ToUserId = toUserId,
Message = message,
Online = 1,
ChatTime = DateTimeHelper.GetUnixTimeSeconds(DateTime.Now),
FromUser = fromUser.Adapt<ChatUserDto>(),
};
if (toUserInfo == null)
{
messageDto.Online = 0;
//TODO 存储离线消息
Console.WriteLine($"{toUserId}不在线");
}
else
{
await Clients.Clients(sendToUser)
.SendAsync("receiveChat", messageDto);
}
Console.WriteLine($"用户{userName}对{toConnectId}-{toUserId}说:{message}");
Console.WriteLine($"用户{userName}对{toUserId}说:{message}");
}
private OnlineUsers GetUserByConnId(string connId)

View File

@ -17,7 +17,7 @@ namespace ZR.ServiceCore.SqlSugar
/// </summary>
/// <param name="services"></param>
/// <param name="environment"></param>
public static void AddDb(this IServiceCollection services,IWebHostEnvironment environment)
public static void AddDb(this IServiceCollection services, IWebHostEnvironment environment)
{
var options = App.OptionsSetting;
List<DbConfigs> dbConfigs = options.DbConfigs;