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

在无服务器Azure SignalR服务中启用MessagePack协议的问题

启用Azure Functions SignalR MessagePack协议的低改动方案

方案一:手动序列化MessagePack消息(最小代码改动)

无需调整架构,仅在发送环节手动将消息序列化为MessagePack格式,客户端需对应处理解析:

  1. 安装MessagePack NuGet包:Install-Package MessagePack
  2. 修改现有函数代码:
[Function("sendMessage")]
[SignalROutput(HubName = "myhub")]
public static async Task<SignalRMessageAction> SendMsgAsync(
    [HttpTrigger(AuthorizationLevel.Function, "post", Route = $"v1/{groupId}")]
    HttpRequestData req,
    string groupId,
    FunctionContext context)
{
    var message = await new StreamReader(req.Body).ReadToEndAsync();
    // 将消息序列化为MessagePack字节数组
    var msgPackData = MessagePackSerializer.Serialize(message, MessagePackSerializerOptions.Standard);
    
    return new("message")
    {
        GroupName = groupId,
        Arguments = new object[] { msgPackData }
    };
}

注意:客户端必须启用MessagePack协议,并将接收到的字节数组反序列化为原始消息内容。

方案二:使用ServiceManager发送(规范支持MessagePack)

通过依赖注入注册配置好MessagePack的ServiceManager,仅需修改函数的发送逻辑,无需大规模架构调整:

  1. 在Program.cs中注册ServiceManager单例:
var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults()
    .ConfigureServices(services =>
    {
        services.AddSingleton(_ =>
        {
            var connectionString = Environment.GetEnvironmentVariable("AzureSignalRConnectionString");
            return new ServiceManagerBuilder()
                .WithOptions(opt =>
                {
                    opt.ConnectionString = connectionString;
                    // 启用MessagePack协议
                    opt.Protocol = MessagePackHubProtocol.Instance;
                })
                .BuildServiceManager();
        });
    })
    .Build();

host.Run();
  1. 修改函数逻辑,替换原输出绑定:
[Function("sendMessage")]
public static async Task<HttpResponseData> SendMsgAsync(
    [HttpTrigger(AuthorizationLevel.Function, "post", Route = $"v1/{groupId}")]
    HttpRequestData req,
    string groupId,
    FunctionContext context,
    [FromServices] ServiceManager serviceManager)
{
    var message = await new StreamReader(req.Body).ReadToEndAsync();
    
    // 创建Hub客户端并发送消息(自动使用MessagePack协议)
    var hubClient = serviceManager.CreateHubClient("myhub");
    await hubClient.SendToGroupAsync(groupId, "message", message);
    
    // 返回成功响应
    var response = req.CreateResponse(HttpStatusCode.OK);
    await response.WriteAsJsonAsync(new { Status = "Message sent successfully" });
    return response;
}

该方案完全遵循SignalR官方的MessagePack支持规范,客户端只需启用MessagePack协议即可正常解析,无需额外处理字节数组。

说明

当前Azure Functions的SignalR输出绑定暂不支持直接配置传输协议,上述两种方案均为低改动实现:方案一适合快速适配现有逻辑,方案二更符合官方规范,可根据实际场景选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 20:25:33