diff --git a/src/Kestrel.Core/CoreStrings.resx b/src/Kestrel.Core/CoreStrings.resx index a8a2db7f84..966dbfd1bb 100644 --- a/src/Kestrel.Core/CoreStrings.resx +++ b/src/Kestrel.Core/CoreStrings.resx @@ -500,4 +500,7 @@ For more information on configuring HTTPS see https://go.microsoft.com/fwlink/?l HTTP/2 support is experimental, see https://go.microsoft.com/fwlink/?linkid=866785 to enable it. + + Cannot write to the response body, the response has completed. + \ No newline at end of file diff --git a/src/Kestrel.Core/Internal/Http/HttpResponseStream.cs b/src/Kestrel.Core/Internal/Http/HttpResponseStream.cs index 90c8cae840..e1c44d645f 100644 --- a/src/Kestrel.Core/Internal/Http/HttpResponseStream.cs +++ b/src/Kestrel.Core/Internal/Http/HttpResponseStream.cs @@ -158,7 +158,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http } break; case HttpStreamState.Closed: - throw new ObjectDisposedException(nameof(HttpResponseStream)); + throw new ObjectDisposedException(nameof(HttpResponseStream), CoreStrings.WritingToResponseBodyAfterResponseCompleted); case HttpStreamState.Aborted: if (cancellationToken.IsCancellationRequested) { diff --git a/src/Kestrel.Core/Properties/CoreStrings.Designer.cs b/src/Kestrel.Core/Properties/CoreStrings.Designer.cs index 7e12e1c524..c915e95dff 100644 --- a/src/Kestrel.Core/Properties/CoreStrings.Designer.cs +++ b/src/Kestrel.Core/Properties/CoreStrings.Designer.cs @@ -878,6 +878,14 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core internal static string FormatWritingToResponseBodyNotSupported(object statusCode) => string.Format(CultureInfo.CurrentCulture, GetString("WritingToResponseBodyNotSupported", "statusCode"), statusCode); + /// + /// Cannot write to the response body, the response has completed. + /// + internal static string WritingToResponseBodyAfterResponseCompleted + { + get => GetString("WritingToResponseBodyAfterResponseCompleted"); + } + /// /// Connection shutdown abnormally. /// diff --git a/test/Kestrel.Core.Tests/HttpResponseStreamTests.cs b/test/Kestrel.Core.Tests/HttpResponseStreamTests.cs index cac27c5f52..06bd3436cd 100644 --- a/test/Kestrel.Core.Tests/HttpResponseStreamTests.cs +++ b/test/Kestrel.Core.Tests/HttpResponseStreamTests.cs @@ -99,7 +99,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests var stream = new HttpResponseStream(Mock.Of(), Mock.Of()); stream.StartAcceptingWrites(); stream.StopAcceptingWrites(); - Assert.Throws(() => { stream.WriteAsync(new byte[1], 0, 1); }); + var ex = Assert.Throws(() => { stream.WriteAsync(new byte[1], 0, 1); }); + Assert.Contains(CoreStrings.WritingToResponseBodyAfterResponseCompleted, ex.Message); } [Fact]