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]