Partage
  • Partager sur Facebook
  • Partager sur Twitter

WebSocket asp.net core

Connection closed before receiving handshake response

    9 mai 2022 à 18:35:23

    Bonjour,

    J'ai un serveur ASP.NET core 6 et un client angular 13.

    J'essaye de mettre en place un websocket qui ne fait rien, je veux pour l'instant juste que mon client se connecte au serveur via un websocket.

    Voici un bout du Program.cs :

    var webSocketOptions = new WebSocketOptions
    {
        KeepAliveInterval = TimeSpan.FromMinutes(2)
    };
    
    app.UseWebSockets(webSocketOptions);

    Et voici le controller:

    [Route("ws")]
        [ApiController]
        public class WebSocketController : ControllerBase
        {
            private readonly ILogger<WebSocketController> _logger;
    
            public WebSocketController(ILogger<WebSocketController> logger)
            {
                _logger = logger;
            }
    
            [HttpGet]
            public async Task Get()
            {
                if (HttpContext.WebSockets.IsWebSocketRequest)
                {
                    using var webSocket = await HttpContext.WebSockets.AcceptWebSocketAsync();
                    _logger.Log(LogLevel.Information, "WebSocket connection established");
                    await Echo(webSocket);
                }
                else
                {
                    HttpContext.Response.StatusCode = 400;
                }
            }
    
            private async Task Echo(WebSocket webSocket)
            {
                var buffer = new byte[1024 * 4];
                var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
                _logger.Log(LogLevel.Information, "Message received from Client");
    
                while (!result.CloseStatus.HasValue)
                {
                    var serverMsg = Encoding.UTF8.GetBytes($"Server: Hello. You said: {Encoding.UTF8.GetString(buffer)}");
                    await webSocket.SendAsync(new ArraySegment<byte>(serverMsg, 0, serverMsg.Length), result.MessageType, result.EndOfMessage, CancellationToken.None);
                    _logger.Log(LogLevel.Information, "Message sent to Client");
    
                    result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
                    _logger.Log(LogLevel.Information, "Message received from Client");
    
                }
                await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
                _logger.Log(LogLevel.Information, "WebSocket connection closed");
            }
        }

    J'ai litéralement pris la doc microsoft, copié collé pour voir si ça marchait.

    Côté angular, j'ai ça

    export class PortfolioDetailComponent implements OnInit {
    
      constructor() {
        this.subject = webSocket('ws://localhost:44498/ws');
        this.subject.subscribe({
          next: (msg: any) => console.log('message received: ' + msg), // Called whenever there is a message from the server.
          error: (err: any) => console.log(err), // Called if at any point WebSocket API signals some kind of error.
          complete: () => console.log('complete') // Called when connection is closed (for whatever reason).
        });
      }
      subject: any;
    
      init() {
      }
    
      ngOnInit() {
      }
    
    }

    Rien de fou je crois mais la console me met ça comme erreur: 

    WebSocketSubject.js:91 WebSocket connection to 'ws://localhost:44498/ws' failed: Connection closed before receiving a handshake response


    c'est quand je fais le subscribe que j'ai ça, pas quand je crée la connection

    Est-ce que quelqu'un aurai une solution à me proposer ?

    Merci



    • Partager sur Facebook
    • Partager sur Twitter

    WebSocket asp.net core

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown