Search code examples
amazon-web-servicesamazon-ec2websocketsignalramazon-elastic-beanstalk

SignalR can't connect when deployed behind AWS EB


I am trying to use SignalR on an application hosted in AWS EB, with an application loadbalancer in front.

It works perfectly fine when I test it locally, but when deployed, the websocket can not establish a connection and returns:

"Error: Failed to start the connection: Error: There was an error with the transport."

And

"There was an error with the transport. at WebSocket.o.onerror [as __zone_symbol__ON_PROPERTYerror]"

I have tried adding a middleware at the very start of my pipeline, that logs if i get a request for my hub, and this works, so I dont think it is the load balancer or anything AWS Related.

If i call the URL with Postman websocket, I get a status code 400.

I have followed the MS guide and added the configuration for JWT auth

jwtTokenOptions.Events = new JwtBearerEvents
{
                    OnMessageReceived = context =>
                    {
                        var accessToken = context.Request.Query["access_token"];

                        // If the request is for our hub...
                        var path = context.HttpContext.Request.Path;
                        if (!string.IsNullOrEmpty(accessToken) &&
                            (path.StartsWithSegments("/signalr")))
                        {
                            // Read the token out of the query string
                            context.Token = accessToken;
                        }
                        return Task.CompletedTask;
                    }
                };

And as I said, it works fine locally. Any suggestions are most welcome


Solution

  • I fixed this by enabling web sockets for the IIS on the eb instance. I did this by creating an eb extension with the following command

    commands:
       01_install_websockets_feature:
          command: "%SystemRoot%\\System32\\dism.exe /online /enable-feature /featurename:IIS-WebSockets"
          ignoreErrors: true