private async Task SendAsync(IPooledBuffer message, IWriteOnlyChannel <IPooledBuffer> output) { try { await output.WriteAsync(message).ConfigureAwait(false); } catch { message.Dispose(); throw; } }
private async Task SendAsync(TransportMessage message, IWriteOnlyChannel <TransportMessage> output) { try { _log.Trace("Sending {0}", message); await output.WriteAsync(message).ConfigureAwait(false); } catch { message.Dispose(); throw; } }
private static async Task GreetingDuplexStreaming( IReadableChannel <GreetingRequest> requestStream, IWriteOnlyChannel <GreetingResponse> responseStream, MethodCallContext context) { Console.WriteLine("Received duplex streaming request from {{{0}}}", context); var greeting = "Hello!"; await responseStream.WriteAsync(new GreetingResponse { Greeting = greeting }).ConfigureAwait(false); Console.WriteLine("Sent: {0}", greeting); while (await requestStream.WaitForNextSafeAsync().ConfigureAwait(false)) { while (requestStream.TryReadSafe(out var request)) { Console.WriteLine("Received: {0}", request.Name); greeting = $"Hello, {request.Name}!"; await responseStream .WriteAsync(new GreetingResponse { Greeting = greeting }) .ConfigureAwait(false); Console.WriteLine("Sent: {0}", greeting); } } Console.WriteLine("Request stream completed"); greeting = "Good Bye!"; await responseStream .WriteAsync(new GreetingResponse { Greeting = greeting }) .ConfigureAwait(false); Console.WriteLine("Sent: {0}", greeting); greeting = "See you again!"; await responseStream .WriteAsync(new GreetingResponse { Greeting = greeting }) .ConfigureAwait(false); Console.WriteLine("Sent: {0}", greeting); Console.WriteLine("Completed"); }
private static async Task GreetingServerStreaming( GreetingRequest request, IWriteOnlyChannel <GreetingResponse> responseStream, MethodCallContext context) { Console.WriteLine("Received server streaming request from {{{0}}}", context); Console.WriteLine("Received: {0}", request.Name); var greeting = $"Hello, {request.Name}!"; await responseStream .WriteAsync(new GreetingResponse { Greeting = greeting }) .ConfigureAwait(false); Console.WriteLine("Sent: {0}", greeting); await Task.Delay(500).ConfigureAwait(false); greeting = $"Hello again, {request.Name}!"; await responseStream .WriteAsync(new GreetingResponse { Greeting = greeting }) .ConfigureAwait(false); Console.WriteLine("Sent: {0}", greeting); Console.WriteLine("Completed"); }
private async Task SendAsync(ITransportChannelHeader header, Maybe <IPooledBuffer> body = default) { try { _log.Trace("Sending header {0} with body {1}", header, body); await _out.WriteAsync(new ChannelMessage(header, body)).ConfigureAwait(false); } catch { header.Dispose(); if (body.HasValue) { body.Value.Dispose(); } throw; } }
private async Task ReceiveLoopAsync(IWriteOnlyChannel <IPooledBuffer> received, CancellationToken cancellationToken) { try { while (true) { _log.Trace("Awaiting next message {0}", _receiveCount); var length = await ReadLengthAsync(cancellationToken).ConfigureAwait(false); if (length == EndMessage) { _log.Trace("Completing receiving datagrams because <END> message received"); break; } _log.Trace("Reading message {0} of length {1}", _receiveCount, length); var datagram = await PooledBuffer .Get(_stream, length, cancellationToken) .ConfigureAwait(false); try { await received.WriteAsync(datagram).ConfigureAwait(false); } catch { datagram.Dispose(); throw; } _log.Trace("Received message {0} of length {1}", _receiveCount, length); _receiveCount++; } } catch { Out.TryTerminate(); throw; } }
private async Task ReceiveLoopAsync(IWriteOnlyChannel <TransportMessage> output, CancellationToken cancellationToken) { while (true) { var maybeData = await _connection.TryReadAsync().ConfigureAwait(false); if (!maybeData.HasValue) { break; } ITransportHeader header; using (var serializedHeader = maybeData.Value) { header = _deserializer.Deserialize(maybeData.Value); } try { var body = Maybe <IPooledBuffer> .Nothing; var expectedBodyLength = GetBodyLengthHandler.Instance.Handle(header); if (expectedBodyLength.HasValue) { body = await _connection.TryReadAsync().ConfigureAwait(false); if (!body.HasValue) { break; } if (body.Value.Count != expectedBodyLength.Value) { try { throw new InvalidOperationException($"Received body length {body.Value.Count} does not equal to the specified in header: {header}"); } finally { body.Value.Dispose(); } } } try { var transportMessage = new TransportMessage(header, body); _log.Debug("Message received: {0}", transportMessage); await output.WriteAsync(transportMessage).ConfigureAwait(false); } catch { if (body.HasValue) { body.Value.Dispose(); } throw; } } catch { header.Dispose(); throw; } } _log.Debug("Incoming messages completed"); }