signalr - 集线器发送的块大于接收的块
问题描述
我有 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 面板时会出现问题。
- 第一个红框(发送文件)显示长度为 57122 字节。
- 第二个红框(接收文件)显示长度为 146515 字节。
为什么差距这么大?
解决方案
看起来您正在尝试发送二进制数据。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
推荐阅读
- aws-appsync - 如何在 AWS AppSync 中查询关注用户的所有帖子
- javascript - Javascript:球击中矩形 Y 轴响应
- javascript - Ionic 4 导航组件没有 Angular
- r - 使用 grep 在 R 中按特定顺序查找两个字母
- javascript - 如何更改按钮上计数器的颜色?
- jquery-ui-resizable - JQuery UI 可调整大小的包含边界框
- angular - 将项目从 angular cli 5.2 升级到 angular CLI 6 后出错
- python - 使用 PIL 在绘图上显示坐标
- c++ - 自定义 QScrollArea 小部件
- html - 静态 HTML 元素是否不受定位元素的影响?