public void StartDuplexStreaming() { StartCore(call => { var clientStreamWriter = new HttpContentClientStreamWriter <TRequest, TResponse>(call); var content = CreatePushStreamContent(call, clientStreamWriter); call.StartDuplexStreamingCore(clientStreamWriter, content); }); }
private PushStreamContent <TRequest, TResponse> CreatePushStreamContent(GrpcCall <TRequest, TResponse> call, HttpContentClientStreamWriter <TRequest, TResponse> clientStreamWriter) { return(new PushStreamContent <TRequest, TResponse>(clientStreamWriter, async requestStream => { ValueTask writeTask; lock (Lock) { Log.SendingBufferedMessages(Logger, BufferedMessages.Count); if (BufferedMessages.Count == 0) { #if NETSTANDARD2_0 writeTask = Task.CompletedTask; #else writeTask = default; #endif } else if (BufferedMessages.Count == 1) { writeTask = call.WriteMessageAsync(requestStream, BufferedMessages[0], call.CancellationToken); } else { // Copy messages to a new collection in lock for thread-safety. var bufferedMessageCopy = BufferedMessages.ToArray(); writeTask = WriteBufferedMessages(call, requestStream, bufferedMessageCopy); } } await writeTask.ConfigureAwait(false); if (ClientStreamComplete) { await call.ClientStreamWriter !.CompleteAsync().ConfigureAwait(false); } }));
public PushStreamContent(HttpContentClientStreamWriter <TRequest, TResponse> streamWriter) { Headers.ContentType = GrpcProtocolConstants.GrpcContentTypeHeaderValue; _streamWriter = streamWriter; }
public PushStreamContent( HttpContentClientStreamWriter <TRequest, TResponse> streamWriter, Func <Stream, ValueTask>?startCallback) : this(streamWriter) { _startCallback = startCallback; }
public PushStreamContent(HttpContentClientStreamWriter <TRequest, TResponse> streamWriter, MediaTypeHeaderValue mediaType) { Headers.ContentType = mediaType; _streamWriter = streamWriter; }