SignalR -连接到websocket服务从javascript没有SignalR库



我有一个小的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版本但你必须在每次调用

的末尾添加神奇字符30
const 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}`);
};

相关内容

  • 没有找到相关文章