我正在编写一个简单的SignalR Core实现,其中用户将文本键入textarea,然后显示给另一个用户。这是通过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处理程序创建一个输入元素或textarea,该处理程序通过websocket连接将整个内容提交给一个接受字符串的SignalR中心函数。
2)复制并粘贴以下字符串到输入元件: “æææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææ”
3)输入随机废话几秒钟。
现在,websocket连接应该与错误代码1007断开连接。
有趣的是,我需要相对大量的北欧角色来触发问题。只有一些人在开始时这还不够。