隔离模式Azure Function App中返回多个SignalR动作的问题问询
解决Azure隔离模式函数返回多个SignalR动作的问题
你的代码报错原因是重复序列化了SignalR动作:actions列表里已经是序列化后的JSON字符串,你又通过Select(x => JsonSerializer.Serialize(x))再次序列化,导致每个元素变成了双重转义的JSON格式(比如"\"{...}\""),SignalR输出绑定无法解析这种无效的动作内容,最终抛出空引用异常。
要实现返回多个不同类型的SignalR动作(比如发消息、管理组),有两种可靠的方式:
方式一:使用强类型动作集合(推荐)
SignalR输出绑定支持直接接收IEnumerable<object>类型的集合,可包含不同类型的SignalR动作对象(如SignalRMessageAction、SignalRGroupAction),无需手动序列化,由绑定自动处理:
public class DispatchMessages { [SignalROutput(HubName = "Hub")] public IEnumerable<object> Actions { get; set; } } public class DoStuff { [Function("RegisterLearner")] public async Task<DispatchMessages> RegisterLearner( [SignalRTrigger("Hub", "messages", "RegisterLearner", "payload")] SignalRInvocationContext invocationContext, RegisterParticipantPayload payload) { var actions = new List<object> { // 向调用客户端发送消息 new SignalRMessageAction("newMessage") { Arguments = new[] { "Lulz" }, ConnectionId = invocationContext.ConnectionId }, // 将客户端加入指定组 new SignalRGroupAction(SignalRGroupActionType.Add) { ConnectionId = invocationContext.ConnectionId, GroupName = $"LearnerGroup_{payload.LearnerId}" }, // 向组内所有成员发送通知 new SignalRMessageAction("groupNotification") { Arguments = new[] { $"学员 {payload.Name} 已加入群组" }, GroupName = $"LearnerGroup_{payload.LearnerId}" } }; return new DispatchMessages { Actions = actions }; } }
方式二:使用字符串集合(不推荐,强类型更安全)
如果必须用字符串承载动作,确保只对动作对象序列化一次,避免重复序列化:
public class DispatchMessages { [SignalROutput(HubName = "Hub")] public IEnumerable<string> Messages { get; set; } } public class DoStuff { [Function("RegisterLearner")] public async Task<DispatchMessages> RegisterLearner( [SignalRTrigger("Hub", "messages", "RegisterLearner", "payload")] SignalRInvocationContext invocationContext, RegisterParticipantPayload payload) { var actions = new List<string> { // 序列化消息动作 JsonSerializer.Serialize(new SignalRMessageAction("newMessage") { Arguments = new[] { "Lulz" }, ConnectionId = invocationContext.ConnectionId }), // 序列化组添加动作 JsonSerializer.Serialize(new SignalRGroupAction(SignalRGroupActionType.Add) { ConnectionId = invocationContext.ConnectionId, GroupName = $"LearnerGroup_{payload.LearnerId}" }) }; return new DispatchMessages { Messages = actions }; } }
这两种方式都能让函数正确返回多个SignalR动作,解决你遇到的空引用异常问题。
内容的提问来源于stack exchange,提问作者pathrider
相关产品推荐
相关产品推荐

