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

SignalR MessagePack:能否将ushort[]直接反序列化为Uint16Array?

ASP.NET SignalR MessagePack 客户端接收ushort[]为Uint16Array的解决方案

问题原因

SignalR的MessagePack协议默认会将.NET的ushort[]反序列化为JavaScript的普通number[],而byte[]因为对应MessagePack的二进制类型(bin),会自动映射为Uint8Array,这就是控制台输出false的原因。

可行解决方案

方案1:客户端手动转换(最简单)

在监听回调中直接将普通数组转换为Uint16Array:

this.hub.addListener('SendImage', (data: number[]) => {
    const uint16Data = new Uint16Array(data);
    console.log(uint16Data instanceof Uint16Array); // 此时输出true
    // 后续业务逻辑处理
});

方案2:自定义MessagePack解码器(自动转换)

SignalR的MessagePack协议基于msgpackr库,可以通过注册自定义解码器实现自动映射:

import { MessagePackHubProtocol } from '@microsoft/signalr-protocol-msgpack';
import { decode, registerDecoder } from 'msgpackr';

// 注册针对ushort数组的自定义解码器
registerDecoder((data, type) => {
    // 判断是否为uint16类型的数组
    if (Array.isArray(data) && data.every(item => item >= 0 && item <= 65535)) {
        return new Uint16Array(data);
    }
    return data;
});

// 创建自定义协议实例
const msgPackProtocol = new MessagePackHubProtocol({
    decode: (buffer) => decode(buffer)
});

// 构建Hub连接
this.hubConnection = new HubConnectionBuilder()
  .withUrl(`${this.configService.apiBaseUrl}/signalRHub`)
  .withAutomaticReconnect([0, 1000, 10000, 30000])
  .withHubProtocol(msgPackProtocol)
  .build();

方案3:服务器端转换格式

在ASP.NET服务器端将ushort[]转换为byte[]发送,客户端接收Uint8Array后再转成Uint16Array:

服务器端C#代码:

ushort[] imageData = ...;
byte[] byteData = new byte[imageData.Length * 2];
Buffer.BlockCopy(imageData, 0, byteData, 0, byteData.Length);
await Clients.All.SendAsync("SendImage", byteData);

客户端TypeScript代码:

this.hub.addListener('SendImage', (data: Uint8Array) => {
    // 从Uint8Array转换为Uint16Array
    const uint16Data = new Uint16Array(data.buffer, data.byteOffset, data.length / 2);
    console.log(uint16Data instanceof Uint16Array); // 输出true
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 19:46:10