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

Azure SignalR Service无服务器Hub问题咨询:连接事件与消息发送

Azure SignalR Service 无服务器模式问题解决方案

问题1、2:OnConnected/OnDisconnected 无日志输出

你的SignalRTrigger属性缺少必要配置,无服务器模式下必须明确指定Hub名称和触发事件类型。修改代码如下:

[FunctionName(nameof(OnConnected))]
public async Task OnConnected(
    [SignalRTrigger("MyHub", "connected")] InvocationContext invocationContext, 
    ILogger logger)
{
    logger.LogInformation($"{invocationContext.ConnectionId} has connected");
}

[FunctionName(nameof(OnDisconnected))]
public async Task OnDisconnected(
    [SignalRTrigger("MyHub", "disconnected")] InvocationContext invocationContext, 
    ILogger logger)
{
    logger.LogInformation($"{invocationContext.ConnectionId} has disconnected");
}

另外检查Negotiate方法:当前返回Negotiate()(ServerlessHub默认方法),但你已注入SignalRConnectionInfo,建议直接返回该对象确保连接信息正确传递:

return new OkObjectResult(connectionInfo);

问题3:向指定客户端发送直接消息

使用Azure Functions的SignalR输出绑定,在函数中注入IAsyncCollector<SignalRMessage>,指定目标ConnectionId发送消息:

[FunctionName("SendToSpecificClient")]
public async Task SendToSpecificClient(
    [HttpTrigger(AuthorizationLevel.Anonymous, "post")] ClientMessage req,
    [SignalR(HubName = "MyHub")] IAsyncCollector<SignalRMessage> signalRMessages,
    ILogger log)
{
    await signalRMessages.AddAsync(new SignalRMessage
    {
        Target = "OrderEvent", // 客户端监听的方法名
        ConnectionId = req.TargetConnectionId, // 目标客户端的ConnectionId
        Arguments = new[] { req.Order, req.Msg } // 传递的参数
    });
}

// 定义接收请求的模型
public class ClientMessage
{
    public string TargetConnectionId { get; set; }
    public string Order { get; set; }
    public string Msg { get; set; }
}

问题4:向群组发送消息

步骤1:让客户端加入群组

可以在OnConnected事件中自动将客户端加入指定群组,或提供单独函数让客户端主动调用加入:

// 方式1:OnConnected时自动加入群组
[FunctionName(nameof(OnConnected))]
public async Task OnConnected(
    [SignalRTrigger("MyHub", "connected")] InvocationContext invocationContext,
    [SignalR(HubName = "MyHub")] IAsyncCollector<SignalRGroupAction> signalRGroupActions,
    ILogger logger)
{
    logger.LogInformation($"{invocationContext.ConnectionId} has connected");
    // 将当前连接加入名为"OrderGroup"的群组
    await signalRGroupActions.AddAsync(new SignalRGroupAction
    {
        ConnectionId = invocationContext.ConnectionId,
        GroupName = "OrderGroup",
        Action = GroupAction.Add
    });
}

// 方式2:提供HTTP函数让客户端主动加入群组
[FunctionName("AddToGroup")]
public async Task AddToGroup(
    [HttpTrigger(AuthorizationLevel.Anonymous, "post")] GroupJoinRequest req,
    [SignalR(HubName = "MyHub")] IAsyncCollector<SignalRGroupAction> signalRGroupActions,
    ILogger log)
{
    await signalRGroupActions.AddAsync(new SignalRGroupAction
    {
        ConnectionId = req.ConnectionId,
        GroupName = req.GroupName,
        Action = GroupAction.Add
    });
}

public class GroupJoinRequest
{
    public string ConnectionId { get; set; }
    public string GroupName { get; set; }
}

步骤2:向群组发送消息

使用SignalR输出绑定,指定GroupName即可:

[FunctionName("SendToGroup")]
public async Task SendToGroup(
    [HttpTrigger(AuthorizationLevel.Anonymous, "post")] GroupMessage req,
    [SignalR(HubName = "MyHub")] IAsyncCollector<SignalRMessage> signalRMessages,
    ILogger log)
{
    await signalRMessages.AddAsync(new SignalRMessage
    {
        Target = "OrderEvent",
        GroupName = req.GroupName,
        Arguments = new[] { req.Order, req.Msg }
    });
}

public class GroupMessage
{
    public string GroupName { get; set; }
    public string Order { get; set; }
    public string Msg { get; set; }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 04:20:34