Signalr 集线器发送的数据块比接收的数据块大

Signalr 集线器发送的数据块比接收的数据块大,signalr,signalr-hub,Signalr,Signalr Hub,我有一个中心,它接收文件,保存到私有静态属性中,然后将文件发送回调用方用户 public class TestHub : Hub { private static string _file; public async Task SendAudio(IAsyncEnumerable<string> stream) { var enumerator = stream.GetAsyncEnumera

我有一个中心,它接收文件,保存到私有静态属性中,然后将文件发送回调用方用户

    public class TestHub : Hub
    {

        private static string _file;

        public async Task SendAudio(IAsyncEnumerable<string> stream)
        {
            var enumerator = stream.GetAsyncEnumerator();
            await enumerator.MoveNextAsync();
            _file = enumerator.Current;
        }
        
        public async IAsyncEnumerable<string> ReceiveFile([EnumeratorCancellation] CancellationToken cancellationToken)
        {
            yield return _file;
        }
    }

公共类TestHub:Hub
{
私有静态字符串_文件;
公共异步任务SendAudio(IAsyncEnumerable流)
{
var枚举器=stream.GetAsyncEnumerator();
等待枚举数。MoveNextAsync();
_file=enumerator.Current;
}
公共异步IAsyncEnumerable接收文件([EnumeratorCancellation]CancellationToken CancellationToken)
{
收益返回文件;
}
}
问题发生在我查看websocket面板时

  • 第一个红色框(发送文件)显示长度为57122字节
  • 第二个红色框(接收文件)显示长度为146515字节

为什么差异如此之大?

看起来您正在尝试发送二进制数据。Json不支持二进制数据,相反,您应该在将数据提供给Json之前对其进行base64编码,在服务器端,您可以对其进行base64解码,或者将其存储为base64 blob。您在这里看到差异的原因是,您的客户端使用您提供的字节,直接使用它们作为UTF8值。然而,在服务器端,当它发送相同的数据回来时,它会看到一些UTF8数据是不安全的,并且会进行一些额外的编码以确保它是安全的,因此大小不同

如果希望避免对blob进行base64编码,可以尝试使用直接支持byte[]的消息包协议