public async Task Invoke(HttpContext context, IBernmobilService bernmobilService) { if (!context.WebSockets.IsWebSocketRequest) { return; } var socket = await context.WebSockets.AcceptWebSocketAsync(); Thread sender = new Thread(() => StartSending(socket, bernmobilService)); sender.Start(); var runInvoke = true; while (runInvoke) { try { var buffer = new byte[4096]; var received = await socket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None); if (received.MessageType == WebSocketMessageType.Close) { runInvoke = false; sender.Interrupt(); return; } } catch (Exception ex) { } } //TODO - investigate the Kestrel exception thrown when this is the last middleware //await _next.Invoke(context); }
private async Task StartSending(WebSocket socket, IBernmobilService bernmobilService) { bool keepRunning = true; while (keepRunning) { var vehiclesGeoJson = await bernmobilService.GetVehicles(); var geoJsonString = JsonConvert.SerializeObject(vehiclesGeoJson); try { Thread.Sleep(500); await socket.SendAsync(new ArraySegment <byte>(Encoding.UTF8.GetBytes(geoJsonString)), WebSocketMessageType.Text, true, default(CancellationToken)); } catch (Exception ex) { keepRunning = false; Thread.CurrentThread.Join(); break; } } }