【问题标题】:How to invoke a SignalR Core hub method from Postman WebSocket如何从 Postman WebSocket 调用 SignalR Core 集线器方法
【发布时间】:2023-03-05 14:54:01
【问题描述】:

我有一个可在 Visual Studio 2019 中运行的 SignalR Core 5.0 应用。我会将 SignalR 服务器部署到 IIS,但想使用新的 WebSocket 在 Postman 中进行一些测试。

在我的 VS 项目中采用我的一个 hub 方法,让我们称之为返回一些数据的“SomeHubMethod”,调用 hub 方法的正确语法是什么?

例如,我将如何为 Postman WebSocket 翻译这个 C# 调用?

SomeHubMethod = 中心方法

groupxyz = 发起对 SignalR 服务器的调用的客户端的名称,因此服务器的响应应发送到“groupxyz”。假设响应是“Hello World!”

"1234" = 只是一些测试数据。

在我的 VS 项目中...

private async void SendSomeHubMethod()
{
    await connection.InvokeAsync("SomeHubMethod", "groupxyz", "1234");
}

在我的课堂上哪里会收到回复...

    connection.On<string>("TheHubResponse", (m) =>
    {
        _ = Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => Debug.WriteLine(m));
        // Hello World!
    });

我在下面的链接中找到的针对 Postman WebSocket 的组装请求...

{"arguments":["groupxyz", "1234"],"invocationId":"0","target":"SomeHubMethod","type":1}

在发送时,邮递员显示已连接但“Hello World!”没有从我的中心返回。

我找到了这篇文章,但调用时没有详细说明。

reference example

【问题讨论】:

    标签: signalr


    【解决方案1】:

    你可以,但有点问题,所以让我们从头开始吧..

    当您定义了 SignalR 集线器端点(即wss://localhost:5005/hub/notifications)时

    1. 向以下 URL 发出 POST 请求(注意 https,而不是 wss):https://localhost:5005/hub/notifications/negotiate?negotiateVersion=1

      作为回答,您将收到以下信息:

      {
          "negotiateVersion": 1,
          "connectionId": "zJ1cqyAe4FRyLCGMzzC0Fw",
          "connectionToken": "HYunLu0j0IHdBY4NNrkm0g",
          "availableTransports": [
              {
                  "transport": "WebSockets",
                  "transferFormats": [
                      "Text",
                      "Binary"
                  ]
              },
              {
                  "transport": "ServerSentEvents",
                  "transferFormats": [
                      "Text"
                  ]
              },
              {
                  "transport": "LongPolling",
                  "transferFormats": [
                      "Text",
                      "Binary"
                  ]
              }
          ]
      }
      
    2. 从上述步骤中获取 connectionToken 并复制它。现在打开与您的集线器的 websocket 连接,如下所示: wss://localhost:5005/hub/notifications?id={connectionToken} 其中 connectionToken 是上一步中的令牌。网址应如下所示:wss://localhost:5005/hub/notifications?id=HYunLu0j0IHdBY4NNrkm0g

    3. 现在持有一些东西.. 根据 Microsoft 文档 (https://github.com/dotnet/aspnetcore/blob/main/src/SignalR/docs/specs/HubProtocol.md#overview),我们需要发送包含以下信息的握手请求:

      {
          "protocol": "json",
          "version": 1
      }
      

      纯文本很难实现,因为它需要以0xE1 ASCII字符结尾,所以我们需要将带有该字符的握手请求转换为base64并发送。我为你做了,这个字符串是:

      eyJwcm90b2NvbCI6Impzb24iLCAidmVyc2lvbiI6MX0e
      
    4. 现在我们掌握了所有这些信息,让我们深入了解 Postman:

      1. 连接到端点:
      2. 只需使用 Base64 将带有我在上面粘贴的字符串的请求发送到内容类型为 Binary 的此 URL。
      3. 如您所见,我们正在收到消息 {"type": 6},这意味着我们已连接到集线器,它正在 ping 我们。
      4. 您现在可以从您的集线器发送/接收任何消息:
      5. 现在您可以将内容类型更改为 JSON 并调用您的中心端点。

    【讨论】:

      【解决方案2】:

      如何从 Postman WebSocket 调用 SignalR Core 集线器方法

      简短的回答,你不能。

      长答案,SignalR 是一种协议,需要一定的仪式才能开始发送和接收消息。例如,您需要一个由服务器生成的ID in the query string。然后你需要通过传输send the handshake request 才能开始调用。

      【讨论】:

      • 请看我的回答,有可能:)
      猜你喜欢
      • 2021-09-06
      • 2018-12-18
      • 2019-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-04
      相关资源
      最近更新 更多