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
相关产品推荐
相关产品推荐

