public async Task SendMessageAsync(Message request) { // enumerate open connections var connections = await _connections.GetAllRowsAsync(); LogInfo($"Found {connections.Count()} open connection(s)"); // attempt to send message on all open connections var messageBytes = Encoding.UTF8.GetBytes(LambdaSerializer.Serialize(new Message { From = request.From, Text = request.Text })); var outcomes = await Task.WhenAll(connections.Select(async(connectionId, index) => { LogInfo($"Post to connection {index}: {connectionId}"); try { await _amaClient.PostToConnectionAsync(new PostToConnectionRequest { ConnectionId = connectionId, Data = new MemoryStream(messageBytes) }); } catch (AmazonServiceException e) when(e.StatusCode == System.Net.HttpStatusCode.Gone) { LogInfo($"Deleting gone connection: {connectionId}"); await _connections.DeleteRowAsync(connectionId); return(false); } catch (Exception e) { LogErrorAsWarning(e, "PostToConnectionAsync() failed"); return(false); } return(true); })); LogInfo($"Data sent to {outcomes.Count(result => result)} connections"); }
public async Task CloseConnectionAsync(APIGatewayProxyRequest request) { try { LogInfo($"Disconnected: {request.RequestContext.ConnectionId} [{request.RequestContext.RouteKey}]"); await _connections.DeleteRowAsync(request.RequestContext.ConnectionId); } catch (Exception e) { LogError(e); throw Abort(CreateResponse(500, $"Failure while attempting to disconnect: {e.Message}")); } }