Files
IM/backend/IM_API/Application/EventHandlers/MessageCreatedHandler/SignalREventHandler.cs
T
nanxun 58bc8b4b5a 前端:
1、优化消息排序逻辑
2、新增加载历史消息
3、修复已知问题
后端:
1、优化消息排序逻辑
2、增加用户信息缓存机制
3、修改日期类型为DateTimeOffset改善时区信息丢失问题
3、修复了已知问题
数据库:
1、新增SequenceId字段用于消息排序
2、新增ClientMsgId字段用于客户端消息回执
2026-02-07 22:37:56 +08:00

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 重试
}
}
}
}