1、优化消息排序逻辑 2、新增加载历史消息 3、修复已知问题 后端: 1、优化消息排序逻辑 2、增加用户信息缓存机制 3、修改日期类型为DateTimeOffset改善时区信息丢失问题 3、修复了已知问题 数据库: 1、新增SequenceId字段用于消息排序 2、新增ClientMsgId字段用于客户端消息回执
55 lines
2.0 KiB
C#
55 lines
2.0 KiB
C#
using AutoMapper;
|
||
using IM_API.Application.Interfaces;
|
||
using IM_API.Domain.Events;
|
||
using IM_API.Dtos;
|
||
using IM_API.Hubs;
|
||
using IM_API.Models;
|
||
using IM_API.Tools;
|
||
using IM_API.VOs.Message;
|
||
using MassTransit;
|
||
using Microsoft.AspNetCore.SignalR;
|
||
|
||
namespace IM_API.Application.EventHandlers.MessageCreatedHandler
|
||
{
|
||
public class SignalREventHandler : IConsumer<MessageCreatedEvent>
|
||
{
|
||
private readonly IHubContext<ChatHub> _hub;
|
||
private readonly IMapper _mapper;
|
||
public SignalREventHandler(IHubContext<ChatHub> hub, IMapper mapper)
|
||
{
|
||
_hub = hub;
|
||
_mapper = mapper;
|
||
}
|
||
|
||
public async Task Consume(ConsumeContext<MessageCreatedEvent> context)
|
||
{
|
||
Console.ForegroundColor = ConsoleColor.Red;
|
||
var @event = context.Message;
|
||
Console.WriteLine($"[SignalR]handlerCreated!");
|
||
try
|
||
{
|
||
// 先转成实体,如果这一步都报错,说明之前的 sbyte -> enum 还没改好
|
||
var entity = _mapper.Map<Message>(@event);
|
||
|
||
// 再从实体转 VO,这是最稳妥的路径,因为这两者的映射你肯定配过了
|
||
var messageBaseVo = _mapper.Map<MessageBaseVo>(entity);
|
||
|
||
// 2. 打印日志确认逻辑执行到这里了
|
||
Console.WriteLine($"[SignalR] 准备向所有人广播消息: {messageBaseVo.Content}");
|
||
|
||
// 3. 执行广播
|
||
await _hub.Clients.User(@event.MsgRecipientId.ToString()).SendAsync("ReceiveMessage", new HubResponse<MessageBaseVo>("Event", messageBaseVo));
|
||
|
||
Console.WriteLine("[SignalR] 广播指令已发出");
|
||
Console.ResetColor();
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
Console.WriteLine($"[SignalR] 发送失败: {ex.Message}");
|
||
Console.ResetColor();
|
||
throw; // 抛出异常触发 MassTransit 重试
|
||
}
|
||
}
|
||
}
|
||
}
|