private async Task HandleWebSocketContextAsync(WebSocket ws, HttpContext httpContext, IWebSocketHandler handler, CancellationToken cancellationToken) { CloseFunction closeFunction = () => ws.CloseAsync(WebSocketCloseStatus.NormalClosure, "Done", CancellationToken.None); SenderFunction sendFunction = (message) => WriteStringAsync(ws, messageWriter.GetString(message), cancellationToken); IMessageHandler messageHandler; try { messageHandler = handler.CreateHandler(httpContext, closeFunction, sendFunction); } catch (Exception e) { logger.Error(e, "Error occured while creating handlers for {0}", httpContext.Request.Path); httpContext.Response.StatusCode = 500; return; } while (ws.State == WebSocketState.Open && !cancellationToken.IsCancellationRequested) { string requestMessage = await webSocketHelper.ReadStringAsync(ws, Encoding.UTF8, cancellationToken); if (requestMessage == null) { continue; } ProcessMessage(requestMessage, messageHandler); } if (ws.State == WebSocketState.Open) { await closeFunction(); } messageHandler.Close(); }
private async Task ReadIncomingMessagesAsync(CancellationToken token) { string data = await webSocketHelper.ReadStringAsync(client, Encoding.UTF8, token); var message = messageReader.ReadString(data); if (message is DebugRequest) { logger.Debug((message as DebugRequest).Data); } else if (message is PingRequest) { await SendAsync(new PongResponse { Timestamp = (message as PingRequest).Timestamp }, token); } else if (message is PongResponse) { logger.Debug(() => $"Delay is {DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() - (message as PongResponse).Timestamp}"); } else { ProcessMessage(message); } }