private async Task HandleWebSocketContextAsync(WebSocket ws, HttpContext httpContext, IWebSocketHandler handler, CancellationToken cancellationToken) { CloseFunction closeFunction = () => ws.CloseAsync(WebSocketCloseStatus.NormalClosure, "Done", CancellationToken.None); List <IMessageHandler> messageHandlers; try { messageHandlers = handler.CreateHandlers(httpContext, closeFunction, (message) => WriteStringAsync(ws, messageWriter.GetString(message), cancellationToken)); } 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, messageHandlers); } if (ws.State == WebSocketState.Open) { await closeFunction(); } handler.Close(messageHandlers); }