diff --git a/src/Servers/Kestrel/Core/src/Internal/Http/Http1Connection.cs b/src/Servers/Kestrel/Core/src/Internal/Http/Http1Connection.cs index 649560ce78..0219d2ca3a 100644 --- a/src/Servers/Kestrel/Core/src/Internal/Http/Http1Connection.cs +++ b/src/Servers/Kestrel/Core/src/Internal/Http/Http1Connection.cs @@ -54,10 +54,11 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http _context.TimeoutControl, this); + Input = _context.Transport.Input; Output = _http1Output; } - public PipeReader Input => _context.Transport.Input; + public PipeReader Input { get; } public bool RequestTimedOut => _requestTimedOut; diff --git a/src/Servers/Kestrel/Transport.Sockets/src/Internal/SocketConnection.cs b/src/Servers/Kestrel/Transport.Sockets/src/Internal/SocketConnection.cs index e84a7e69ce..3a52cf5358 100644 --- a/src/Servers/Kestrel/Transport.Sockets/src/Internal/SocketConnection.cs +++ b/src/Servers/Kestrel/Transport.Sockets/src/Internal/SocketConnection.cs @@ -154,13 +154,15 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal private async Task ProcessReceives() { + // Resolve `input` PipeWriter via the IDuplexPipe interface prior to loop start for performance. + var input = Input; while (true) { // Wait for data before allocating a buffer. await _receiver.WaitForDataAsync(); // Ensure we have some reasonable amount of buffer space - var buffer = Input.GetMemory(MinAllocBufferSize); + var buffer = input.GetMemory(MinAllocBufferSize); var bytesReceived = await _receiver.ReceiveAsync(buffer); @@ -171,9 +173,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal break; } - Input.Advance(bytesReceived); + input.Advance(bytesReceived); - var flushTask = Input.FlushAsync(); + var flushTask = input.FlushAsync(); var paused = !flushTask.IsCompleted; @@ -238,9 +240,11 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal private async Task ProcessSends() { + // Resolve `output` PipeReader via the IDuplexPipe interface prior to loop start for performance. + var output = Output; while (true) { - var result = await Output.ReadAsync(); + var result = await output.ReadAsync(); if (result.IsCanceled) { @@ -256,7 +260,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal await _sender.SendAsync(buffer); } - Output.AdvanceTo(end); + output.AdvanceTo(end); if (isCompleted) {