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

隔离模式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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 07:47:45