public virtual async Task InvokeAsync(HttpContext context) { try { if (!context.WebSockets.IsWebSocketRequest) { return; } var userId = context.Request.GetHeaderValue("UserId"); var userName = context.Request.GetHeaderValue("UserName"); ConnectionAborted abortStatus = ConnectionAborted.None; if (string.IsNullOrEmpty(userId.ToString())) { abortStatus = ConnectionAborted.UserIdNotFound; } else if (string.IsNullOrEmpty(userName)) { abortStatus = ConnectionAborted.UserNameNotFound; } var info = new WSUserInfo() { Id = userId, Name = userName }; await InvokeWSAsync(context, info, abortStatus); } catch (Exception ex) { Logger.LogError(ex, "An error on opening connection of WebSocket to the server"); } }
protected async Task InvokeWSAsync(HttpContext context, WSUserInfo userInfo, ConnectionAborted abortStatus = ConnectionAborted.None) { try { await WebSocketHub.WSManager.RemoveWebSocketIfExists(userInfo.Id); var socket = await context.WebSockets.AcceptWebSocketAsync(); if (abortStatus == ConnectionAborted.None) { await WebSocketHub.OnConnectedAsync(socket, userInfo); await Receive(socket, async (result, buffer) => { if (result.MessageType == WebSocketMessageType.Binary) { await WebSocketHub.ReceiveMessageAsync(socket, Encoding.UTF8.GetString(buffer, 0, result.Count)); } else { await WebSocketHub.OnDisconnectedAsync(userInfo.Id); } return; }); } else { await WebSocketHub.WSManager.AbortConnection(socket, abortStatus); } } catch { throw; } }
/// <summary> /// To connect new created WebSocket to the WebSocketManager's sockets list /// </summary> /// <param name="socket">New created socket</param> /// <param name="userInfo">Current User info</param> public virtual async Task OnConnectedAsync(System.Net.WebSockets.WebSocket socket, WSUserInfo userInfo) { await WSManager.AddSocket(userInfo.Id, socket, userInfo); await SendNotificationAsync(userInfo.Id, new { }, Notification.WSConnected); }