private async Task WebSocketRequest(AspNetWebSocketContext context) { // Получаем сокет клиента из контекста запроса WebSocket socket = context.WebSocket; //Подключение к PostgreSQL PGLayer pg = new PGLayer(); ArraySegment <byte> buffer = new ArraySegment <byte>(new byte[1024]); // Добавляем его в список клиентов, проверяем пользователя Locker.EnterWriteLock(); try { WS ws = new WS(); ws.client = socket; //Проверяем пользователя userStr = dispayName(ws); // Clients1.RemoveAll(us => us.user.ip == ws.user.ip && us.user.accountName == ws.user.accountName); Clients1.Add(ws); //Зафиксировали подключение пользователя string err = pg.user_conn(ws.user.accountName, "подключился/лась"); // pg.connect(); //if (err =="") await socket.SendAsync(new ArraySegment <byte>(Encoding.UTF8.GetBytes(userStr)), WebSocketMessageType.Text, true, CancellationToken.None); } finally { Locker.ExitWriteLock(); } //проверка через LDAP //if (!validateUserByBind("jane", "")) //{ return; } // Слушаем сокет while (true) { // Ожидаем данные от него var result = await socket.ReceiveAsync(buffer, CancellationToken.None); //Количество клиентов сокета userCount userCount = new userCount(); //Передаём сообщение всем клиентам for (int i = 0; i < Clients1.Count; i++) { WebSocket client = Clients1[i].client; try { // Microsoft.Office.Interop.Outlook.Application oApp = new Microsoft.Office.Interop.Outlook.Application(); if (client.State == WebSocketState.Open) { var text = Encoding.UTF8.GetString(buffer.Array.ToArray(), 0, result.Count); // if (text.Trim() != "") JObject ob = JObject.Parse(text); //пользователь подключился к серверу if (ob["mode"].ToString() == "join") { string err = pg.user_conn(ob["user"]["accountName"].ToString(), "отключился/лась"); } else //сообщение пользователям if (ob["mode"].ToString() == "msg") { string err = pg.user_msg(ob["user"]["accountName"].ToString(), ob["msg"].ToString(), 1, Clients1[i].user.ip); await client.SendAsync(new ArraySegment <byte>(Encoding.UTF8.GetBytes(text)), WebSocketMessageType.Text, true, CancellationToken.None); } else //поиск пользователя в AD if (ob["mode"].ToString() == "FindUser") { var strFilter1 = new { mode = "strFilter", accountName = Clients1[i].user.accountName, str = FilterAD(ob["strFilter"].ToString()) }; //string err = pg.user_msg(ob["user"]["accountName"].ToString(), ob["msg"].ToString(), 1, Clients1[i].user.ip); await client.SendAsync(new ArraySegment <byte>(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(strFilter1))), WebSocketMessageType.Text, true, CancellationToken.None); } // await client.SendAsync(new ArraySegment<byte>(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(JsonConvert.DeserializeObject(text)))), WebSocketMessageType.Text, true, CancellationToken.None); //var userCount = new { mode = "usersCount", usersCount = Clients1.Count }; userCount.usersCount = Clients1.Count; //Clients1.Count(us => us.client.State == WebSocketState.Open); await client.SendAsync(new ArraySegment <byte>(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(userCount))), WebSocketMessageType.Text, true, CancellationToken.None); } } catch (ObjectDisposedException ex) { Locker.EnterWriteLock(); try { Clients1.RemoveAll(i1 => i1.client == client); i--; } finally { Locker.ExitWriteLock(); } } } } }