diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/Connection.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/Connection.cs
index 2ba693ef73..9c9e225a9f 100644
--- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/Connection.cs
+++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/Connection.cs
@@ -135,7 +135,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Internal.Http
public Task StopAsync()
{
- _frame.Stop();
+ _frame.StopAsync();
_frame.SocketInput.CompleteAwaiting();
return _socketClosedTcs.Task;
@@ -156,7 +156,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Internal.Http
{
if (_filteredStreamAdapter != null)
{
- _readInputTask.ContinueWith((task, state) =>
+ Task.WhenAll(_readInputTask, _frame.StopAsync()).ContinueWith((task, state) =>
{
var connection = (Connection)state;
connection._filterContext.Connection.Dispose();
diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/Frame.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/Frame.cs
index 9a13ab2cb7..f85940605c 100644
--- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/Frame.cs
+++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/Frame.cs
@@ -365,7 +365,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Internal.Http
this,
default(CancellationToken),
TaskCreationOptions.DenyChildAttach,
- TaskScheduler.Default);
+ TaskScheduler.Default).Unwrap();
}
///
@@ -374,7 +374,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Internal.Http
/// Stop will be called on all active connections, and Task.WaitAll() will be called on every
/// return value.
///
- public Task Stop()
+ public Task StopAsync()
{
if (!_requestProcessingStopping)
{
diff --git a/test/Microsoft.AspNetCore.Server.Kestrel.FunctionalTests/HttpsTests.cs b/test/Microsoft.AspNetCore.Server.Kestrel.FunctionalTests/HttpsTests.cs
index 716c71e7b0..8f3a624406 100644
--- a/test/Microsoft.AspNetCore.Server.Kestrel.FunctionalTests/HttpsTests.cs
+++ b/test/Microsoft.AspNetCore.Server.Kestrel.FunctionalTests/HttpsTests.cs
@@ -105,7 +105,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
{
try
{
- await httpContext.Response.WriteAsync($"hello, world\r\r", ct);
+ await httpContext.Response.WriteAsync($"hello, world", ct);
await Task.Delay(1000, ct);
}
catch (TaskCanceledException)
@@ -136,6 +136,54 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
Assert.False(loggerFactory.ErrorLogger.ObjectDisposedExceptionLogged);
}
+ [Fact]
+ public async Task DoesNotThrowObjectDisposedExceptionFromWriteAsyncAfterConnectionIsAborted()
+ {
+ var tcs = new TaskCompletionSource