SignalR、websockets 和 go

我需要从 Go 连接到 SignalR 服务器。我一直在尝试使用一些库和文章来帮助我:

问题是我需要从不同的端口检索令牌。我的 SignalR 服务器地址是https://server:10446/endpoint,但我需要从中检索我的令牌https://server:10443/connect/token,这与正常的 SignalR 协议不同。

我能够得到我的令牌。并且能够获得以下响应的协商步骤:

{

    "connectionId": "JkOfCC0JykJ8hfzm8jd53w",

    "availableTransports": [

      {

        "transport": "WebSockets",

        "transferFormats": [

          "Text",

          "Binary"

        ]

      },

      {

        "transport": "ServerSentEvents",

        "transferFormats": [

          "Text"

        ]

      },

      {

        "transport": "LongPolling",

        "transferFormats": [

          "Text",

          "Binary"

        ]

      }

    ]

  }

然后我尝试通过使用 gorilla websockets 进行 websocket 连接来建立连接:


wss://server:10446/endpoint?transport=WebSockets&id=${ConnectionIDFromNegotiate}&connectionData=[{\"name\":\"HubName\"}]&access_token=${MyRetrievedToken}

此时,我收到一条回复说101,升级到 websocket。但是,从这一刻起,我无法继续握手。我正在向服务器发送消息,但除了 15-20 秒后握手中止之外,我没有得到任何响应。


这是我用来连接和发送握手消息的代码:


    ws, resp, err := websocket.DefaultDialer.Dial(u.String(), nil)

    if err != nil {

        return nil, err

    }

    if err = ws.WriteMessage(websocket.TextMessage, []byte(`{"protocol": "json","version": 1}`)); err != nil {

        return nil, err

    }

任何想法都会受到热烈欢迎:)



温温酱
浏览 166回答 1
1回答

波斯汪

Brennan给出了解决方案。非常感谢!看起来您缺少部分消息有效负载。Spec github.com/dotnet/aspnetcore/blob/master/src/SignalR/docs/specs/... “HandshakeRequest 和 HandshakeResponse 消息都必须以 ASCII 字符 0x1E(记录分隔符)终止。”
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go