Gregory Bologna
Gregory Bologna

Reputation: 285

How to invoke a SignalR Core hub method from Postman WebSocket

I have a SignalR Core 5.0 app that works in Visual Studio 2019. I will deploy the SignalR server to IIS but want to do some testing in Postman using the new WebSockets.

Taking one of my hub methods in my VS project, let's call it "SomeHubMethod" that returns some data, what is the proper syntax to invoke the hub method?

For instance, how would I translate this C# invoke for Postman WebSocket?

SomeHubMethod = The hub method

groupxyz = The name of the client originating the call to SignalR server, and so the response from the server should be sent to "groupxyz". Let's say the response is "Hello World!"

"1234" = Just some test data.

In my VS project...

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

Where the response would be received in my class...

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

My assembled request that I found in link below for Postman WebSocket...

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

On Send, Postman shows Connected but "Hello World!" is not returned from my hub.

I found this post but it is not detailed on invoke.

reference example

Upvotes: 1

Views: 4883

Answers (2)

Adrian
Adrian

Reputation: 199

You can but it's kinda problematic, so let's start from beginning..

When you have your defined SignalR hub endpoint (ie. wss://localhost:5005/hub/notifications) then

  1. Make a POST request to following URL (notice the https, not the wss): https://localhost:5005/hub/notifications/negotiate?negotiateVersion=1.

    In answer you will receive following information:

    {
        "negotiateVersion": 1,
        "connectionId": "zJ1cqyAe4FRyLCGMzzC0Fw",
        "connectionToken": "HYunLu0j0IHdBY4NNrkm0g",
        "availableTransports": [
            {
                "transport": "WebSockets",
                "transferFormats": [
                    "Text",
                    "Binary"
                ]
            },
            {
                "transport": "ServerSentEvents",
                "transferFormats": [
                    "Text"
                ]
            },
            {
                "transport": "LongPolling",
                "transferFormats": [
                    "Text",
                    "Binary"
                ]
            }
        ]
    }
    
  2. Get the connectionToken from the step above and copy it. Now open a websocket connection with your hub like following: wss://localhost:5005/hub/notifications?id={connectionToken} where connectionToken is the token from previous step. The url should look like: wss://localhost:5005/hub/notifications?id=HYunLu0j0IHdBY4NNrkm0g.

  3. Now hold something.. according to the Microsoft documentation (https://github.com/dotnet/aspnetcore/blob/main/src/SignalR/docs/specs/HubProtocol.md#overview) we need to send a handshake request with following informations:

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

    It's hard to achieve by plain text because it needs to ends with a 0xE1 ASCII character, so we need to convert the handshake request with that character to base64 and send it. I did it for you and this string is:

    eyJwcm90b2NvbCI6Impzb24iLCAidmVyc2lvbiI6MX0e
    
  4. Now when we have all these info, let's deep dive into Postman:

    1. Connect to the endpoint: Connecting to endpoint
    2. Just send a request with string I pasted above to this URL with content-type: Binary using Base64. Request
    3. As you can see, we are receiving message {"type": 6} what means we are connected to the Hub and it's pinging us.
    4. You can now send/receive any messages from your hub: Received info
    5. Now you can change the content-type to JSON and invoke your hub endpoints.

Upvotes: 14

Brennan
Brennan

Reputation: 1931

How to invoke a SignalR Core hub method from Postman WebSocket

Short answer, you can't.

Long answer, SignalR is a protocol that requires certain ceremony to start sending and receiving messages. For example, you need an ID in the query string that is generated by the server. Then you need to send the handshake request over the transport before you can start making invocations.

Upvotes: 4

Related Questions