我有一个小的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吗?
在您连接到服务器之前,正在进行连接协商。此时服务器发送发送和接收消息所需的所有数据。没有连接协商,您将无法连接到服务器。一旦实现了连接协商,您可能就完成了SignalR客户机的一半。我写了一篇博客文章描述SignalR协议,它应该帮助你理解下面的事情是如何工作的,以及为什么用你自己的websocket连接到服务器不是直截了当的(或者根本不可能,如果你不遵循SignalR协议)。
编辑
ASP。. NET核心版本的SignalR现在允许使用裸webSocket连接到服务器。
我只是想添加一个,它是可能连接到ASP。带有websocket的SignalR的Core版本但你必须在每次调用
的末尾添加神奇字符30const endChar = String.fromCharCode(30);
socket.send(`{"arguments":["arg1"],"streamIds":[],"target":"TestMethod","type":1}${endChar}`);
fracimdsamric Thibault给出了很好的答案,但是遗漏了一件重要的事情。连接完成后,需要直接发送协议和版本号。否则,您将得到错误:
An unexpected error occurred during connection handshake.
下面是一个关于如何在纯JavaScript和WebSockets中使用signalR的完整工作示例:
let socket = new WebSocket("wss://your-url");
socket.onopen = function(e) {
console.log("[open] Connection established");
const endChar = String.fromCharCode(30);
// send the protocol & version
socket.send(`{"protocol":"json","version":1}${endChar}`);
};
socket.onmessage = function(event) {
console.log(`[message] Data received from server: ${event.data}`);
// parse server data
const serverData = event.data.substring(0, event.data.length - 1);
// after sending the protocol & version subscribe to your method(s)
if (serverData === "{}") {
const endChar = String.fromCharCode(30);
socket.send(`{"arguments":[],"invocationId":"0","target":"Your-Method","type":1}${endChar}`);
return;
}
// handle server messages
};
socket.onclose = function(event) {
if (event.wasClean) {
console.log(`[close] Connection closed cleanly, code=${event.code} reason=${event.reason}`);
} else {
console.log('[close] Connection died');
}
};
socket.onerror = function(error) {
console.log(`[error] ${error.message}`);
};