- ABP Framework version: v7.4.0
- UI Type: Angular
- Database System: EF Core (SQL Server)
- Tiered (for MVC) or Auth Server Separated (for Angular): Separated. Microservices
- Exception message and full stack trace: requestId: 0HN22O3N3S1OE:00000003, previousRequestId: no previous request id, message: Error Code: RequestTimedOutError Message: Timeout making http request, exception: System.Threading.Tasks.TaskCanceledException: The request was canceled due to the configured HttpClient.Timeout of 90 seconds elapsing.
- Steps to reproduce the issue:
We added SignalR to one of our microservices and Angular frontend using the following guide: https://docs.abp.io/en/abp/latest/SignalR-Integration
When we try to use it from our frontend, the two negotiation requests resolve fine, but then when it tries to connect we get a TimeOut Exception. When we try to debug the OnConnectedAsync method in the hub we see that it doesn't stop at a breakpoint, so I understand it doesn't even execute it. The microservice (OperacionesService) doesn't throw any errors.
This is the Hub in our microservice:
public class DemoHub: AbpHub<PlanillaDespachosAppService>
{
private readonly IPlanillaDespachoRepository _planillaDespachoRepository;
public DemoHub(IPlanillaDespachoRepository planillaDespachoRepository)
{
_planillaDespachoRepository = planillaDespachoRepository;
}
public async override Task OnConnectedAsync()
{
var x = CurrentUser.Id;
Console.WriteLine(x);
await base.OnConnectedAsync();
}
public async override Task OnDisconnectedAsync(Exception exception)
{
var x = CurrentUser.Id;
Console.WriteLine(x);
await base.OnDisconnectedAsync(exception);
}
}
This is the OnApplicationInitialization in our WebGateway:
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
var app = context.GetApplicationBuilder();
var env = context.GetEnvironment();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseCorrelationId();
app.UseCors();
app.UseSwagger();
app.UseSwaggerUI(options =>
{
options.SwaggerEndpoint("/swagger/v1/swagger.json", "Web Gateway API");
var configuration = context.ServiceProvider.GetRequiredService<IConfiguration>();
options.OAuthClientId(configuration["AuthServer:SwaggerClientId"]);
options.OAuthClientSecret(configuration["AuthServer:SwaggerClientSecret"]);
});
app.UseAbpSerilogEnrichers();
app.MapWhen(
ctx => ctx.Request.Path.ToString().StartsWith("/api/abp/api-definition") ||
ctx.Request.Path.ToString().TrimEnd('/').Equals(""),
app2 =>
{
app2.UseRouting();
app2.UseConfiguredEndpoints();
}
);
app.UseWebSockets();
app.UseOcelot().Wait();
}
The SignalR config in appsettings.json of WebGateway:
{
"DownstreamPathTemplate": "/signalr-hubs/{everything}",
"DownstreamScheme": "https",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 44878
}
],
"UpstreamPathTemplate": "/signalr-hubs/{everything}",
"UpstreamHttpMethod": [
"Put",
"Delete",
"Get",
"Post"
]
},
{
"DownstreamPathTemplate": "/ws",
"UpstreamPathTemplate": "/",
"DownstreamScheme": "ws",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 44878
}
]
}
The connection methods in our frontend (Angular):
private createConnection() {
if (!this.connection) {
this.connection = new HubConnectionBuilder()
.withUrl('https://localhost:44325/signalr-hubs/demo',
{
accessTokenFactory: () => this.userService.getAccessToken(),
transport: HttpTransportType.ServerSentEvents
})
// .withUrl('/Notifications',
// {
// accessTokenFactory: () => userId,
// // THis will use websockets by default, if it does not work try uncommenting this line
// // transport: HttpTransportType.ServerSentEvents
// })
.withAutomaticReconnect()
// .configureLogging(LogLevel.Debug)
.build();
}
}
connectNotifications() {
if (!this.userService.hasValidAccessToken()) return;
this.createConnection();
if (this.connection.state == HubConnectionState.Disconnected)
this.connection
.start()
.catch(err => console.log('Error while starting connection to notification service: ' + err));
this.connection.on('1q1q', console.log);
}
sendMessage(val: string) {
console.log(this.connection.state);
this.connection.send('1q1q', val)
}
When we load the page that tries to connect to the hub we get the following logs and Network status:
WebGateway:
2024-03-12 16:03:43.651 -03:00 [INF] Request starting HTTP/2 OPTIONS https://localhost:44325/signalr-hubs/demo/negotiate?negotiateVersion=1 - -
2024-03-12 16:03:43.651 -03:00 [INF] CORS policy execution successful.
2024-03-12 16:03:43.651 -03:00 [INF] Request finished HTTP/2 OPTIONS https://localhost:44325/signalr-hubs/demo/negotiate?negotiateVersion=1 - - - 204 - - 0.2349ms
2024-03-12 16:03:43.663 -03:00 [INF] Request starting HTTP/2 POST https://localhost:44325/signalr-hubs/demo/negotiate?negotiateVersion=1 - 0
2024-03-12 16:03:43.664 -03:00 [INF] CORS policy execution successful.
2024-03-12 16:03:43.664 -03:00 [INF] requestId: 0HN22O3N3S1OM:00000001, previousRequestId: no previous request id, message: EndpointRateLimiting is not enabled for /signalr-hubs/{everything}
2024-03-12 16:03:43.664 -03:00 [INF] requestId: 0HN22O3N3S1OM:00000001, previousRequestId: no previous request id, message: No authentication needed for /signalr-hubs/demo/negotiate
2024-03-12 16:03:43.664 -03:00 [INF] requestId: 0HN22O3N3S1OM:00000001, previousRequestId: no previous request id, message: /signalr-hubs/{everything} route does not require user to be authorized
2024-03-12 16:03:43.895 -03:00 [INF] requestId: 0HN22O3N3S1OM:00000001, previousRequestId: no previous request id, message: 200 (OK) status code, request uri: https://localhost:44878/signalr-hubs/demo/negotiate?negotiateVersion=1
2024-03-12 16:03:43.895 -03:00 [INF] Request finished HTTP/2 POST https://localhost:44325/signalr-hubs/demo/negotiate?negotiateVersion=1 - 0 - 200 316 application/json 231.5712ms
2024-03-12 16:03:43.906 -03:00 [INF] Request starting HTTP/2 GET https://localhost:44325/signalr-hubs/demo?id=RnQFLvileEO8aoDcl7QboQ&access_token=eyJh...asd - -
2024-03-12 16:03:43.906 -03:00 [INF] CORS policy execution successful.
2024-03-12 16:03:43.907 -03:00 [INF] requestId: 0HN22O3N3S1OM:00000003, previousRequestId: no previous request id, message: EndpointRateLimiting is not enabled for /signalr-hubs/{everything}
2024-03-12 16:03:43.907 -03:00 [INF] requestId: 0HN22O3N3S1OM:00000003, previousRequestId: no previous request id, message: No authentication needed for /signalr-hubs/demo
2024-03-12 16:03:43.907 -03:00 [INF] requestId: 0HN22O3N3S1OM:00000003, previousRequestId: no previous request id, message: /signalr-hubs/{everything} route does not require user to be authorized
2024-03-12 16:05:13.908 -03:00 [WRN] requestId: 0HN22O3N3S1OM:00000003, previousRequestId: no previous request id, message: Error Code: RequestTimedOutError Message: Timeout making http request, exception: System.Threading.Tasks.TaskCanceledException: The request was canceled due to the configured HttpClient.Timeout of 90 seconds elapsing.
---> System.TimeoutException: The operation was canceled.
---> System.Threading.Tasks.TaskCanceledException: The operation was canceled.
---> System.IO.IOException: Unable to read data from the transport connection: La operación de E/S se anuló por una salida de subproceso o por una solicitud de aplicación..
---> System.Net.Sockets.SocketException (995): La operación de E/S se anuló por una salida de subproceso o por una solicitud de aplicación.
--- End of inner exception stack trace ---
at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, CancellationToken cancellationToken)
at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.System.Threading.Tasks.Sources.IValueTaskSource<System.Int32>.GetResult(Int16 token)
at System.Net.Security.SslStream.EnsureFullTlsFrameAsync[TIOAdapter](CancellationToken cancellationToken)
at System.Runtime.CompilerServices.PoolingAsyncValueTaskMethodBuilder`1.StateMachineBox`1.System.Threading.Tasks.Sources.IValueTaskSource<TResult>.GetResult(Int16 token)
at System.Net.Security.SslStream.ReadAsyncInternal[TIOAdapter](Memory`1 buffer, CancellationToken cancellationToken)
at System.Runtime.CompilerServices.PoolingAsyncValueTaskMethodBuilder`1.StateMachineBox`1.System.Threading.Tasks.Sources.IValueTaskSource<TResult>.GetResult(Int16 token)
at System.Net.Http.HttpConnection.FillAsync(Boolean async)
at System.Net.Http.HttpConnection.ChunkedEncodingReadStream.CopyToAsyncCore(Stream destination, CancellationToken cancellationToken)
--- End of inner exception stack trace ---
at System.Net.Http.HttpConnection.ChunkedEncodingReadStream.CopyToAsyncCore(Stream destination, CancellationToken cancellationToken)
at System.Net.Http.HttpConnectionResponseContent.<SerializeToStreamAsync>g__Impl|6_0(Stream stream, TransportContext context, CancellationToken cancellationToken)
at System.Net.Http.HttpContent.LoadIntoBufferAsyncCore(Task serializeToStreamTask, MemoryStream tempBuffer)
at System.Net.Http.HttpClient.<SendAsync>g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken)
--- End of inner exception stack trace ---
--- End of inner exception stack trace ---
at System.Net.Http.HttpClient.HandleFailure(Exception e, Boolean telemetryStarted, HttpResponseMessage response, CancellationTokenSource cts, CancellationToken cancellationToken, CancellationTokenSource pendingRequestsCts)
at System.Net.Http.HttpClient.<SendAsync>g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken)
at Ocelot.Requester.HttpClientHttpRequester.GetResponse(HttpContext httpContext) errors found in ResponderMiddleware. Setting error response for request path:/signalr-hubs/demo, request method: GET
2024-03-12 16:05:13.908 -03:00 [INF] Request finished HTTP/2 GET https://localhost:44325/signalr-hubs/demo?id=RnQFLvileEO8aoDcl7QboQ&access_token=eyJh...asd - - - 503 0 - 90002.9186ms
OperacionesService:
2024-03-12 16:03:43.676 -03:00 [INF] Request starting HTTP/1.1 POST https://localhost:44878/signalr-hubs/demo/negotiate?negotiateVersion=1 - 0
2024-03-12 16:03:43.889 -03:00 [INF] Executing endpoint '/signalr-hubs/demo/negotiate'
2024-03-12 16:03:43.894 -03:00 [INF] Executed endpoint '/signalr-hubs/demo/negotiate'
2024-03-12 16:03:43.895 -03:00 [INF] Request finished HTTP/1.1 POST https://localhost:44878/signalr-hubs/demo/negotiate?negotiateVersion=1 - 0 - 200 316 application/json 218.4628ms
2024-03-12 16:03:43.908 -03:00 [INF] Request starting HTTP/1.1 GET https://localhost:44878/signalr-hubs/demo?id=RnQFLvileEO8aoDcl7QboQ&access_token=eyJhb...asd - 0
2024-03-12 16:03:43.910 -03:00 [INF] Executing endpoint '/signalr-hubs/demo'
2024-03-12 16:05:13.918 -03:00 [INF] Executed endpoint '/signalr-hubs/demo'
2024-03-12 16:05:13.920 -03:00 [INF] Request finished HTTP/1.1 GET https://localhost:44878/signalr-hubs/demo?id=RnQFLvileEO8aoDcl7QboQ&access_token=eyJhb...asd - 0 - 200 - text/event-stream 90013.2758ms
13 Answer(s)
-
0
Hi,
transport: HttpTransportType.ServerSentEvents
Can you try using
websocket
instead ofServerSentEvents
? -
0
Hello liangshiwei,
I just tried that. Now I'm not getting the TimeOut error, but it seems it's still not connecting correctly. These are the logs:
WebGateway (You can see a UnableToFindDownstreamRouteError error):
2024-03-13 08:57:47.440 -03:00 [INF] Request starting HTTP/2 OPTIONS https://localhost:44325/signalr-hubs/demo/negotiate?negotiateVersion=1 - - 2024-03-13 08:57:47.440 -03:00 [INF] CORS policy execution successful. 2024-03-13 08:57:47.440 -03:00 [INF] Request finished HTTP/2 OPTIONS https://localhost:44325/signalr-hubs/demo/negotiate?negotiateVersion=1 - - - 204 - - 0.2458ms 2024-03-13 08:57:47.451 -03:00 [INF] Request starting HTTP/2 POST https://localhost:44325/signalr-hubs/demo/negotiate?negotiateVersion=1 - 0 2024-03-13 08:57:47.451 -03:00 [INF] CORS policy execution successful. 2024-03-13 08:57:47.452 -03:00 [INF] requestId: 0HN22O3N3S1OQ:00000001, previousRequestId: no previous request id, message: EndpointRateLimiting is not enabled for /signalr-hubs/{everything} 2024-03-13 08:57:47.452 -03:00 [INF] requestId: 0HN22O3N3S1OQ:00000001, previousRequestId: no previous request id, message: No authentication needed for /signalr-hubs/demo/negotiate 2024-03-13 08:57:47.452 -03:00 [INF] requestId: 0HN22O3N3S1OQ:00000001, previousRequestId: no previous request id, message: /signalr-hubs/{everything} route does not require user to be authorized 2024-03-13 08:57:47.465 -03:00 [INF] requestId: 0HN22O3N3S1OQ:00000001, previousRequestId: no previous request id, message: 200 (OK) status code, request uri: https://localhost:44878/signalr-hubs/demo/negotiate?negotiateVersion=1 2024-03-13 08:57:47.466 -03:00 [INF] Request finished HTTP/2 POST https://localhost:44325/signalr-hubs/demo/negotiate?negotiateVersion=1 - 0 - 200 316 application/json 14.6363ms 2024-03-13 08:57:47.478 -03:00 [INF] Request starting HTTP/2 CONNECT https://localhost:44325/signalr-hubs/demo?id=-BoVMzEFfiK1Z_aHpGzQGw&access_token=eyJh...asd - - 2024-03-13 08:57:47.478 -03:00 [INF] CORS policy execution successful. 2024-03-13 08:57:47.478 -03:00 [WRN] requestId: 0HN22O3N3S1OQ:00000003, previousRequestId: no previous request id, message: DownstreamRouteFinderMiddleware setting pipeline errors. IDownstreamRouteFinder returned Error Code: UnableToFindDownstreamRouteError Message: Failed to match Route configuration for upstream path: /signalr-hubs/demo, verb: CONNECT. 2024-03-13 08:57:47.478 -03:00 [INF] Request finished HTTP/2 CONNECT https://localhost:44325/signalr-hubs/demo?id=-BoVMzEFfiK1Z_aHpGzQGw&access_token=eyJh...asd - - - 200 - - 0.5002ms 2024-03-13 08:57:47.478 -03:00 [INF] Connection id "0HN22O3N3S1OQ", Request id "0HN22O3N3S1OQ:00000003": the application completed without reading the entire request body.
OperacionesService:
2024-03-13 08:57:47.462 -03:00 [INF] Request starting HTTP/1.1 POST https://localhost:44878/signalr-hubs/demo/negotiate?negotiateVersion=1 - 0 2024-03-13 08:57:47.464 -03:00 [INF] Executing endpoint '/signalr-hubs/demo/negotiate' 2024-03-13 08:57:47.465 -03:00 [INF] Executed endpoint '/signalr-hubs/demo/negotiate' 2024-03-13 08:57:47.465 -03:00 [INF] Request finished HTTP/1.1 POST https://localhost:44878/signalr-hubs/demo/negotiate?negotiateVersion=1 - 0 - 200 316 application/json 3.4574ms
The request appears to return a 200 code, but it still doesn't get to the hub methods:
Also when we try to send a message we still get the following error (we were getting the same error before the change you suggested also):
-
0
You can try updating your Ocelot config
{ "DownstreamPathTemplate": "/signalr-hubs/{everything}", "DownstreamScheme": "ws", // or wss "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 44878 } ], "UpstreamPathTemplate": "/signalr-hubs/{everything}" }
-
0
I'm still getting errors with signalr. I tried updating the Ocelot config as you mentioned and it still doesn't work.
I tried different configurations and it throws different errors. With this current configuration, both handshakes return 200 codes. Then the WS request returns a 200 code but appears to throw and "Unrecognized frame upcode: 6" error, and we get a new Exception on the WebGateway log:
Current WebGateway config:
{ "DownstreamPathTemplate": "/signalr-hubs/{everything}", "DownstreamScheme": "wss", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 44878 } ], "UpstreamPathTemplate": "/signalr-hubs/{everything}" }, { "DownstreamPathTemplate": "/ws", "UpstreamPathTemplate": "/", "DownstreamScheme": "wss", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 44878 } ] }
WebGateway logs:
2024-03-14 13:34:20.456 -03:00 [INF] Request starting HTTP/2 OPTIONS https://localhost:44325/signalr-hubs/demo/negotiate?negotiateVersion=1 - - 2024-03-14 13:34:20.457 -03:00 [INF] CORS policy execution successful. 2024-03-14 13:34:20.457 -03:00 [INF] Request finished HTTP/2 OPTIONS https://localhost:44325/signalr-hubs/demo/negotiate?negotiateVersion=1 - - - 204 - - 0.4313ms 2024-03-14 13:34:20.470 -03:00 [INF] Request starting HTTP/2 POST https://localhost:44325/signalr-hubs/demo/negotiate?negotiateVersion=1 - 0 2024-03-14 13:34:20.471 -03:00 [INF] CORS policy execution successful. 2024-03-14 13:34:20.471 -03:00 [INF] requestId: 0HN248IBU7TIA:00000001, previousRequestId: no previous request id, message: EndpointRateLimiting is not enabled for /signalr-hubs/{everything} 2024-03-14 13:34:20.471 -03:00 [INF] requestId: 0HN248IBU7TIA:00000001, previousRequestId: no previous request id, message: No authentication needed for /signalr-hubs/demo/negotiate 2024-03-14 13:34:20.471 -03:00 [INF] requestId: 0HN248IBU7TIA:00000001, previousRequestId: no previous request id, message: /signalr-hubs/{everything} route does not require user to be authorized 2024-03-14 13:34:20.485 -03:00 [INF] requestId: 0HN248IBU7TIA:00000001, previousRequestId: no previous request id, message: 200 (OK) status code, request uri: wss://localhost:44878/signalr-hubs/demo/negotiate?negotiateVersion=1 2024-03-14 13:34:20.485 -03:00 [INF] Request finished HTTP/2 POST https://localhost:44325/signalr-hubs/demo/negotiate?negotiateVersion=1 - 0 - 200 316 application/json 14.7364ms 2024-03-14 13:34:20.497 -03:00 [INF] Request starting HTTP/2 CONNECT https://localhost:44325/signalr-hubs/demo?id=O_QfCDfM1fl8YqKTWpheSg&access_token=eyJh...asd - - 2024-03-14 13:34:20.497 -03:00 [INF] CORS policy execution successful. 2024-03-14 13:34:20.524 -03:00 [ERR] requestId: 0HN248IBU7TIA:00000003, previousRequestId: no previous request id, message: Exception caught in global error handler, exception message: The WebSocket is in an invalid state ('Aborted') for this operation. Valid states are: 'Open, CloseReceived', exception stack: at System.Net.WebSockets.WebSocketValidate.ThrowIfInvalidState(WebSocketState currentState, Boolean isDisposed, WebSocketState[] validStates) at System.Net.WebSockets.ManagedWebSocket.CloseOutputAsyncCore(WebSocketCloseStatus closeStatus, String statusDescription, CancellationToken cancellationToken) at Ocelot.WebSockets.Middleware.WebSocketsProxyMiddleware.PumpWebSocket(WebSocket source, WebSocket destination, Int32 bufferSize, CancellationToken cancellationToken) at Ocelot.WebSockets.Middleware.WebSocketsProxyMiddleware.Proxy(HttpContext context, String serverEndpoint) at Ocelot.WebSockets.Middleware.WebSocketsProxyMiddleware.Invoke(HttpContext httpContext) at Ocelot.DownstreamUrlCreator.Middleware.DownstreamUrlCreatorMiddleware.Invoke(HttpContext httpContext) at Ocelot.LoadBalancer.Middleware.LoadBalancingMiddleware.Invoke(HttpContext httpContext) at Ocelot.Request.Middleware.DownstreamRequestInitialiserMiddleware.Invoke(HttpContext httpContext) at Ocelot.Multiplexer.MultiplexingMiddleware.Invoke(HttpContext httpContext) at Ocelot.DownstreamRouteFinder.Middleware.DownstreamRouteFinderMiddleware.Invoke(HttpContext httpContext) at Ocelot.Errors.Middleware.ExceptionHandlerMiddleware.Invoke(HttpContext httpContext) RequestId: 0HN248IBU7TIA:00000003 System.Net.WebSockets.WebSocketException (0x80004005): The WebSocket is in an invalid state ('Aborted') for this operation. Valid states are: 'Open, CloseReceived' at System.Net.WebSockets.WebSocketValidate.ThrowIfInvalidState(WebSocketState currentState, Boolean isDisposed, WebSocketState[] validStates) at System.Net.WebSockets.ManagedWebSocket.CloseOutputAsyncCore(WebSocketCloseStatus closeStatus, String statusDescription, CancellationToken cancellationToken) at Ocelot.WebSockets.Middleware.WebSocketsProxyMiddleware.PumpWebSocket(WebSocket source, WebSocket destination, Int32 bufferSize, CancellationToken cancellationToken) at Ocelot.WebSockets.Middleware.WebSocketsProxyMiddleware.Proxy(HttpContext context, String serverEndpoint) at Ocelot.WebSockets.Middleware.WebSocketsProxyMiddleware.Invoke(HttpContext httpContext) at Ocelot.DownstreamUrlCreator.Middleware.DownstreamUrlCreatorMiddleware.Invoke(HttpContext httpContext) at Ocelot.LoadBalancer.Middleware.LoadBalancingMiddleware.Invoke(HttpContext httpContext) at Ocelot.Request.Middleware.DownstreamRequestInitialiserMiddleware.Invoke(HttpContext httpContext) at Ocelot.Multiplexer.MultiplexingMiddleware.Invoke(HttpContext httpContext) at Ocelot.DownstreamRouteFinder.Middleware.DownstreamRouteFinderMiddleware.Invoke(HttpContext httpContext) at Ocelot.Errors.Middleware.ExceptionHandlerMiddleware.Invoke(HttpContext httpContext) 2024-03-14 13:34:20.525 -03:00 [INF] Request finished HTTP/2 CONNECT https://localhost:44325/signalr-hubs/demo?id=O_QfCDfM1fl8YqKTWpheSg&access_token=eyJh...asd - - - 200 - - 28.1154ms
The WS request returns a 200 code, but in the messages tab it shows an error:
-
0
Hi,
This may be a problem with Ocelot, I'm not sure.
https://github.com/ThreeMammals/Ocelot/issues/930
Could you share a simple project via email that can reproduce the problem with me? I will check it. thanks shiwei.liang@volosoft.com
-
0
Hi,
I just sent you an example project via email. Please, let me know if you need anything else to test the problem.
Thanks!
-
0
Hi,
- Update route config:
{ "DownstreamPathTemplate": "/signalr-hubs/{everything}", "DownstreamScheme": "wss", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 44361 } ], "UpstreamPathTemplate": "/signalr-hubs/{everything}" }, { "DownstreamPathTemplate": "/ws", "UpstreamPathTemplate": "/", "DownstreamScheme": "wss", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 44361 } ] }
- Add
app.UseWebSockets();
toTransitWebGatewayModule
app.UseWebSockets(); app.UseOcelot().Wait();
- Update
ServiciodemoService
private createConnection() { if (!this.connection) { this.connection = new HubConnectionBuilder() .withUrl('https://localhost:44325/signalr-hubs/demo', { accessTokenFactory: () => this.userService.getAccessToken(), transport: HttpTransportType.WebSockets }) // .withUrl('/Notifications', // { // accessTokenFactory: () => userId, // // THis will use websockets by default, if it does not work try uncommenting this line // // transport: HttpTransportType.ServerSentEvents // }) .withAutomaticReconnect() // .configureLogging(LogLevel.Debug) .build(); this.connection.start(); } }
-
0
Hi,
Can you upload the full solution to the same Google Drive I uploaded it?
I implemented the fixes and I'm still getting the same errors:
- Handshakes work fine
- Requests returns 200 code, but I'm still getting the errors:
- On frontend:
WebSocket connection to 'wss://localhost:44325/signalr-hubs/demo?id=G-hyAmzj1-GUAN6EYnrTyw' failed: Unrecognized frame opcode: 6
WebSocket closed with status code: 1006 (no reason given).
- On WebGateway log:
- On frontend:
requestId: 0HN28RBEI53CU:00000003, previousRequestId: no previous request id, message: Exception caught in global error handler, exception message: The WebSocket is in an invalid state ('Aborted') for this operation. Valid states are: 'Open, CloseReceived', exception stack: at System.Net.WebSockets.WebSocketValidate.ThrowIfInvalidState(WebSocketState currentState, Boolean isDisposed, WebSocketState[] validStates)
Thanks!
-
0
Ok, shared
-
0
Hello,
We are still experiencing the same errors.
Could this be an issue related to some configuration on our machines related to WebSockets? Or maybe the Locale/Region the frontend and backend are configured? (maybe the Signalr library expects or uses english, and the locales in our machines are in spanish)
Thanks!
-
0
Hi,
It looks like SignalR is working, but the connect is closed abnormally.
You can check those: https://stackoverflow.com/questions/53944572/signalr-core-error-websocket-closed-with-status-code-1006 https://stackoverflow.com/questions/19304157/getting-the-reason-why-websockets-closed-with-close-code-1006
-
0
Hi,
I made some more tests, and I found out that if I run the WebGateway with IIS Express from Visual Studio, Signalr works fine.
I only get the errors when I run the csproj direclty, either from Visual Studio or with Tye.
Why could this be? Is there a way to configure the csproj, Program.cs, or tye so it has the same behavior as when running it with IIS?
Thanks.
-
0
Hi,
Maybe you can check this: https://github.com/dotnet/aspnetcore/issues/41675 They explain how to view more detailed logs to check the cause of the error