【问题标题】:SignalR Core: Connection closes with error code 1007SignalR Core:连接关闭并出现错误代码 1007
【发布时间】: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


【解决方案1】:

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

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

【讨论】: