SignalR 核心:连接关闭,错误代码为 1007

SignalR Core: Connection closes with error code 1007

我正在编写一个简单的 SignalR 核心实现,其中用户将文本键入文本区域,然后显示给其他用户使用。这是通过 SignalR 集线器传输内容字符串来完成的。这几分钟工作正常,但随后连接突然关闭并显示消息:

'Error: Websocket closed with status code: 1007 ()'.

查了下错误码,好像是字符串不是UTF-8编码的问题。这对我来说真的没有意义,因为我正在向接受字符串的集线器函数发送一个普通的 javascript 字符串。当然,这是一个简单的 SignalR 实现的教科书示例?

我试过将字符串编码为 UTF-8,通过这个技巧我发现:

function forceUnicodeEncoding(string) {
  return unescape(encodeURIComponent(string));
}

但这并不能解决问题。

我的集线器功能如下所示:

public async Task SendContent(string text)
{
    _contentString = text;
    await Clients.Others.SendAsync("ReceiveContent", _contentString);
}

_contentString是输入内容的静态缓存。

我这样称呼它

    this.hubConnection.invoke('SendContent', contentString)

其中 "contentString" 是来自 TextArea onChange 函数的 event.target 的值。

我是不是漏掉了什么?

编辑:这似乎与使用非标准字符有关,例如北欧字母 æøå

重现步骤,适合没有北欧键盘的人

1) 使用 onChange 处理程序创建一个输入元素或文本区域,该处理程序通过 websocket 连接将整个内容提交给接受字符串的 SignalR 中心函数。

2) 将以下字符串复制并粘贴到输入元素中:

3) 随机输入几秒钟。

websocket 连接现在应该断开,错误代码为 1007。

有趣的是我需要比较多的北欧字符才能触发这个问题。刚开始的时候有几个是不够的。

https://github.com/dotnet/corefx/issues/29834

事实证明这是实际 websocket 实现中的一个错误。不幸的是,目前没有解决方法,所以我已经切换到 SSE 传输,直到错误得到修复。