【发布时间】:2026-02-09 12:10:02
【问题描述】:
我正在编写一个简单的 SignalR Core 实现,其中用户在文本区域中键入文本,然后将其显示给另一个用户。这是通过 SignalR 集线器传输内容字符串来完成的。这可以正常工作几分钟,但随后连接突然关闭并显示以下消息:
'Error: Websocket closed with status code: 1007 ()'.
查找错误代码,似乎问题在于该字符串不是UTF-8编码的。这对我来说真的没有意义,因为我将一个普通的 javascript 字符串发送到一个接受字符串的集线器函数。当然,这是一个简单的 SignalR 实现的教科书示例?
我已经尝试将字符串编码为 UTF-8,通过我发现的这个技巧:
function forceUnicodeEncoding(string) {
return unescape(encodeURIComponent(string));
}
但这并不能解决问题。
我的 hub 函数如下所示:
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。
有趣的是我需要相对大量的北欧字符来触发这个问题。一开始只有几个是不够的。
【问题讨论】:
-
在使用 HTML 文本输入元素时也会发生同样的情况,因此它似乎与文本传输的速率有关。
-
测试了一些,好像这与使用非标准字符有关,例如北欧字母æøå。如果我只是按住其中一个按钮几秒钟,websocket 就会断开连接,而使用标准字母不会导致任何问题。
标签: signalr-hub signalr.client asp.net-core-signalr