Пример #1
0
        public async Task <ActionResult <Order> > CreateOrder([FromBody] Order orderToCreate)
        {
            // Assign customer id to the created order
            orderToCreate.CustomerId = int.Parse(User.Claims.FirstOrDefault(c => c.Type.Equals("id"))?.Value);

            var createdOrder = await _orderService.CreateOrderAsync(orderToCreate);

            // Broadcast order to all drivers
            Package package     = new Package("OrderService", "AddOrder", JsonConvert.SerializeObject(createdOrder));
            string  jsonPackage = JsonConvert.SerializeObject(package);

            foreach (var ws in _manager.GetDriverSockets())
            {
                if (ws.Value.Socket.State == WebSocketState.Open)
                {
                    await ws.Value.Socket.SendAsync(Encoding.UTF8.GetBytes(jsonPackage), WebSocketMessageType.Text, true, CancellationToken.None);
                }
            }

            return(createdOrder);
        }
Пример #2
0
        public async Task InvokeAsync(HttpContext context)
        {
            if (context.WebSockets.IsWebSocketRequest)
            {
                WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();

                bool isDriver = false;

                var userId = int.Parse(context.Request.Query["id"]);

                if (context.Request.Path.ToString().ToLower() == "/driver")
                {
                    _manager.AddDriverSocket(userId, webSocket);
                    isDriver = true;
                    Console.WriteLine($"New socket (driver) connection established (with user id: {userId})");
                }
                else
                {
                    _manager.AddSocket(userId, webSocket);
                    Console.WriteLine($"New socket (customer) connection established (with user id: {userId})");
                }

                //Send ConnID Back
                // await SendConnID(webSocket, conn);

                await Receive(webSocket, async (result, buffer) =>
                {
                    if (result.MessageType == WebSocketMessageType.Text)
                    {
                        Console.WriteLine("Receive->Text");
                        Console.WriteLine($"Message: {Encoding.UTF8.GetString(buffer, 0, result.Count)}");

                        await RouteJSONMessageAsync(Encoding.UTF8.GetString(buffer, 0, result.Count));
                    }
                    else if (result.MessageType == WebSocketMessageType.Close)
                    {
                        WebSocketConnection webSocketConnection;

                        if (isDriver)
                        {
                            WebSocketConnection foundWebSocket = _manager.GetDriverSockets().FirstOrDefault(s => s.Value.Socket == webSocket).Value;
                            _manager.GetDriverSockets().TryRemove(foundWebSocket.SocketConnectionId, out webSocketConnection);
                        }
                        else
                        {
                            WebSocketConnection foundWebSocket = _manager.GetCustomerSockets().FirstOrDefault(s => s.Value.Socket == webSocket).Value;
                            _manager.GetCustomerSockets().TryRemove(foundWebSocket.SocketConnectionId, out webSocketConnection);
                        }

                        Console.WriteLine($"Socket connection closed -> close for user id: {webSocketConnection?.UserId}");

                        await webSocketConnection.Socket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
                    }
                });
            }
            else
            {
                Console.WriteLine("Not a websocket request");
                await _next(context);
            }
        }