diff --git a/src/Microsoft.AspNetCore.Mvc.ViewFeatures/Internal/PagedBufferedTextWriter.cs b/src/Microsoft.AspNetCore.Mvc.ViewFeatures/Internal/PagedBufferedTextWriter.cs index b4f2f575c2..9f728e2196 100644 --- a/src/Microsoft.AspNetCore.Mvc.ViewFeatures/Internal/PagedBufferedTextWriter.cs +++ b/src/Microsoft.AspNetCore.Mvc.ViewFeatures/Internal/PagedBufferedTextWriter.cs @@ -86,19 +86,22 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Internal _charBuffer.Append(value); } - public override Task WriteAsync(char value) + public override async Task WriteAsync(char value) { - return _inner.WriteAsync(value); + await FlushAsync(); + await _inner.WriteAsync(value); } - public override Task WriteAsync(char[] buffer, int index, int count) + public override async Task WriteAsync(char[] buffer, int index, int count) { - return _inner.WriteAsync(buffer, index, count); + await FlushAsync(); + await _inner.WriteAsync(buffer, index, count); } - public override Task WriteAsync(string value) + public override async Task WriteAsync(string value) { - return _inner.WriteAsync(value); + await FlushAsync(); + await _inner.WriteAsync(value); } protected override void Dispose(bool disposing) diff --git a/test/Microsoft.AspNetCore.Mvc.ViewFeatures.Test/Internal/PagedBufferedTextWriterTest.cs b/test/Microsoft.AspNetCore.Mvc.ViewFeatures.Test/Internal/PagedBufferedTextWriterTest.cs index 91954fb81b..1f3db0aefb 100644 --- a/test/Microsoft.AspNetCore.Mvc.ViewFeatures.Test/Internal/PagedBufferedTextWriterTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.ViewFeatures.Test/Internal/PagedBufferedTextWriterTest.cs @@ -187,6 +187,63 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Internal Assert.Equal(Content, inner.ToString().ToCharArray()); } + [Fact] + public async Task SynchronousWrites_FollowedByAsyncWriteString_WritesAllContent() + { + // Arrange + var pool = new TestArrayPool(); + var inner = new StringWriter(); + + var writer = new PagedBufferedTextWriter(new TestArrayPool(), inner); + + // Act + writer.Write('a'); + writer.Write(new[] { 'b', 'c', 'd' }); + writer.Write("ef"); + await writer.WriteAsync("ghi"); + + // Assert + Assert.Equal("abcdefghi", inner.ToString()); + } + + [Fact] + public async Task SynchronousWrites_FollowedByAsyncWriteChar_WritesAllContent() + { + // Arrange + var pool = new TestArrayPool(); + var inner = new StringWriter(); + + var writer = new PagedBufferedTextWriter(new TestArrayPool(), inner); + + // Act + writer.Write('a'); + writer.Write(new[] { 'b', 'c', 'd' }); + writer.Write("ef"); + await writer.WriteAsync('g'); + + // Assert + Assert.Equal("abcdefg", inner.ToString()); + } + + [Fact] + public async Task SynchronousWrites_FollowedByAsyncWriteCharArray_WritesAllContent() + { + // Arrange + var pool = new TestArrayPool(); + var inner = new StringWriter(); + + var writer = new PagedBufferedTextWriter(new TestArrayPool(), inner); + + // Act + writer.Write('a'); + writer.Write(new[] { 'b', 'c', 'd' }); + writer.Write("ef"); + await writer.WriteAsync(new[] { 'g', 'h', 'i' }); + + // Assert + Assert.Equal("abcdefghi", inner.ToString()); + } + [Fact] public async Task FlushAsync_ReturnsPages() {