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(); }