首页 > 解决方案 > 集线器发送的块大于接收的块

问题描述

我有 Hub 接收文件,保存到私有静态属性中,然后将文件发送回调用者用户。

    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;
        }
    }

当我查看 websocket 面板时会出现问题。

在此处输入图像描述

为什么差距这么大?

标签: signalrsignalr-hub

解决方案


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

如果您想避免必须对 blob 进行 base64 编码,您可以尝试直接支持 byte[] 的 Message Pack 协议。https://docs.microsoft.com/aspnet/core/signalr/messagepackhubprotocol?view=aspnetcore-3.1


推荐阅读