我有一个小型的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?
答案 0 :(得分:5)
在连接到服务器之前,会发生连接协商。这是服务器发送发送和接收消息所需的所有数据。如果没有连接协商,您将无法连接到服务器。实施连接协商后,您可能需要实施一个SignalR客户端。我写了一个blog post describing SignalR protocol,它可以帮助你了解事情是如何工作的,以及为什么用你自己的websocket连接到服务器并不简单(或者如果你不遵循SignalR协议则根本不可能)。
修改强>
SignalR的ASP.NET核心版现在允许使用裸webSocket连接到服务器。
答案 1 :(得分:3)
我只是想添加一个可以通过websocket连接到SignalR的ASP.NET Core版本,但是您必须在每次通话结束时添加魔术字符30
const endChar = String.fromCharCode(30);
socket.send(`{"arguments":["arg1"],"streamIds":[],"target":"TestMethod","type":1}${endChar}`);