首页 > 解决方案 > 如何从 Postman WebSocket 调用 SignalR Core 集线器方法

问题描述

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

在我的 VS 项目中使用我的一个集线器方法,我们称它为返回一些数据的“SomeHubMethod”,调用集线器方法的正确语法是什么?

例如,我将如何为 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!” 没有从我的集线器返回。

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

参考例子

标签: signalr

解决方案


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

当您定义了 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. 现在拿着一些东西..根据微软文档(https://github.com/dotnet/aspnetcore/blob/main/src/SignalR/docs/specs/HubProtocol.md#overview)我们需要发送一个握手请求,如下资料:

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

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

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

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

推荐阅读