SignalR - 在没有 SignalR 库的情况下从 javascript 连接到 websocket 服务

SignalR - connect to websocket service from javascript without SignalR library

我有一个我已经开始的小型 SignalR 项目,现在它所做的只是接收一个字符串并将其回显给所有连接的用户。

我想知道的是,由于 SignalR 在我的服务器上打开了 websockets - 如何使用常规 websockets javascript 代码连接到该服务? (我有理由想在没有 SignalR 库的情况下这样做)。

我看过 chrome 开发者工具,发现浏览器连接的地址是:

ws://localhost:53675/signalr/connect?transport=webSockets&clientProtocol=1.4&connectionToken=YKgNxA6dhmtHya1srzPPIv6KFIYEjLTFOogXqcjPErFcKCmRdjvS2X6A2KmraW%2BrLnRUNf68gYPdOkOOgJ8yRcq4iCDm%2BbUyLejsr2NySNZBvLloWuMIAvgI6oC%2Fyt%2Ba&connectionData=%5B%7B%22name%22%3A%22ophirhubtest%22%7D%5D&tid=7

如何生成令牌?

然后,似乎客户端和服务器之间的消息只是常规 json 格式的文本(这很容易模仿):

{"C":"d-9E7D682A-A,1|E,0|F,1|G,0","S":1,"M":[]}
{"H":"ophirhubtest","M":"Echo","A":["test"],"I":0}
{"C":"d-9E7D682A-A,2|E,0|F,1|G,0","M":[{"H":"ophirHubTest","M":"printEcho","A":["You said: test"]}]}

如果我只是尝试连接而不是连接但连接很快关闭。如果我删除令牌,它会立即关闭。

是否可以连接到 WS "manually"?

在您可以连接到服务器之前,正在进行连接协商。这是服务器发送发送和接收消息所需的所有数据的时候。如果没有连接协商,您将无法连接到服务器。实施连接协商后,您可能已经实施了 SignalR 客户端的一半。我写了一篇 blog post describing SignalR protocol,它应该可以帮助您了解底层的工作原理,以及为什么使用您自己的 websocket 连接到服务器并不简单(或者如果您不遵循 SignalR 协议,则根本不可能)。

编辑

SignalR 的 ASP.NET 核心版本现在允许使用裸 webSocket 连接到服务器。

我只想补充一点,可以使用 websocket 连接到 ASP.NET SignalR 的核心版本,但您必须在每次调用结束时添加魔法字符 30

const endChar = String.fromCharCode(30);
socket.send(`{"arguments":["arg1"],"streamIds":[],"target":"TestMethod","type":1}${endChar}`);