You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SignalR跨后端消息接收异常:Admin发消息Client未收到排查

问题分析与解决方案

核心问题点

  • 发送目标错误:Admin登录时调用的是SendMessageToAdmin,但要给Client发消息,得调用SendMessageToClient才能把消息递送到Client服务的Hub。
  • Hub方法不匹配:Admin端调用了不存在的SendMessageToAdmin方法,而Hub里只定义了ReceiveMessage方法,导致消息无法正确触发处理逻辑。
  • 消息流转逻辑错配:当前代码里,Admin发送的消息只在自身Hub内部循环,没有传递到Client服务的监听连接上。

分步修正方案

1. 修正Admin控制器的发送目标

把Admin登录控制器里的发送方法改成SendMessageToClient,确保消息发往Client服务:

public async Task<IActionResult> Login([FromBody] UserLoginDto userLoginDto)
{
    // 改为发送到Client的Hub
    await SubmissionEventHub.SendMessageToClient("Send from admin Hello, Client!");
    var userLogged = await _authService.Authenticate(userLoginDto);
    return Ok(CustomResponseDto<UserLoggedDto>.SuccessResponse(StatusCodes.Status201Created,userLogged));
}

2. 修正Hub方法调用的匹配问题

Admin端调用的方法名必须和Hub中定义的一致,把SendMessageToAdmin里的调用改为ReceiveMessage:

#region Admin
public static async Task SendMessageToAdmin(string message)
{
    if (_adminConnection == null)
    {
        await ConnectToAdminHub();
    }
    // 改为调用Hub中存在的ReceiveMessage方法
    await _adminConnection.InvokeAsync("ReceiveMessage", message);
}
#endregion

3. 确保Client端正确监听并处理消息

Client启动时已经连接了Admin的Hub,现在要让Client自身的Hub也能接收并打印消息,修改Client端的SubmissionEventHub:

public class SubmissionEventHub : Hub
{
    // 保留原有静态连接、监听代码...

    // 新增:Client Hub收到消息时直接打印日志
    public async Task ReceiveMessage(string message)
    {
        Log.Information($"Client Hub received message: {message}");
        await Clients.All.SendAsync("ReceiveMessage", message);
    }
}

4. 优化跨服务连接的可靠性

静态HubConnection容易出现连接断开后无法恢复的问题,给连接加上自动重连逻辑:

public static async Task ConnectToClientHub()
{
    _clientConnection = new HubConnectionBuilder()
        .WithUrl("https://localhost:7150/submissionEventHub")
        .WithAutomaticReconnect() // 开启自动重连
        .Build();

    _clientConnection.On<string>("ReceiveMessage", (message) =>
    {
        Log.Information($"Received alert message from app Client: {message}");
    });

    // 连接断开后自动重试
    _clientConnection.Closed += async (error) =>
    {
        await Task.Delay(new Random().Next(0, 5) * 1000);
        await ConnectToClientHub();
    };

    await _clientConnection.StartAsync();
}

5. 补充跨域配置(如果需要)

因为两个服务端口不同,必须配置跨域才能让SignalR连接正常建立,在Admin和Client的program.cs中分别添加:

// Admin的program.cs
builder.Services.AddCors(options =>
{
    options.AddPolicy("AllowClient",
        policy => policy.WithOrigins("https://localhost:7150")
                        .AllowAnyHeader()
                        .AllowAnyMethod()
                        .AllowCredentials());
});

app.UseCors("AllowClient");

// Client的program.cs
builder.Services.AddCors(options =>
{
    options.AddPolicy("AllowAdmin",
        policy => policy.WithOrigins("https://localhost:7240")
                        .AllowAnyHeader()
                        .AllowAnyMethod()
                        .AllowCredentials());
});

app.UseCors("AllowAdmin");

验证步骤

  1. 同时启动Admin和Client服务
  2. 调用Admin的登录接口触发消息发送
  3. 查看Client服务的控制台,应该能看到类似Received alert message from app Client: Send from admin Hello, Client!的日志输出

内容的提问来源于stack exchange,提问作者Thanh Nguyen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 07:32:13