public async Task <HttpResponseMessage> Connect(string nickName) { if (string.IsNullOrEmpty(nickName)) { throw new HttpResponseException(HttpStatusCode.BadRequest); } WebSocketHandler webSocketHandler = new WebSocketHandler(); // Handle the case where client forgot to close connection last time if (handlers.ContainsKey(nickName)) { WebSocketHandler origHandler = handlers[nickName]; handlers.Remove(nickName); try { await origHandler.Close(); } catch { // unexcepted error when trying to close the previous websocket } } handlers[nickName] = webSocketHandler; string conversationId = string.Empty; string watermark = null; webSocketHandler.OnOpened += ((sender, arg) => { Conversation conversation = this.directLineClient.Conversations.StartConversation(); conversationId = conversation.ConversationId; }); webSocketHandler.OnTextMessageReceived += (async(sender, message) => { // Do nothing with heartbeat message // Send text message to bot service for non-heartbeat message if (!string.Equals(message, "heartbeat", StringComparison.OrdinalIgnoreCase)) { await OnTextMessageReceived(webSocketHandler, message, conversationId, watermark); } }); webSocketHandler.OnBinaryMessageReceived += (async(sender, bytes) => { await OnBinaryMessageReceived(webSocketHandler, bytes, conversationId, watermark); }); webSocketHandler.OnClosed += (sender, arg) => { handlers.Remove(nickName); }; HttpContext.Current.AcceptWebSocketRequest(webSocketHandler); return(Request.CreateResponse(HttpStatusCode.SwitchingProtocols)); }