Use CloseOutputAsync to close client transport WebSocket (#695)
* Use CloseOutputAsync to close client transport WebSocket Fixes #568
This commit is contained in:
parent
47d14e5d45
commit
f9ee7911a5
|
|
@ -67,6 +67,7 @@ namespace Microsoft.AspNetCore.Sockets.Client
|
||||||
// https://github.com/SignalR/SignalR/blob/1fba14fa3437e24c204dfaf8a18db3fce8acad3c/src/Microsoft.AspNet.SignalR.Core/Owin/WebSockets/WebSocketHandler.cs#L248-L251
|
// https://github.com/SignalR/SignalR/blob/1fba14fa3437e24c204dfaf8a18db3fce8acad3c/src/Microsoft.AspNet.SignalR.Core/Owin/WebSockets/WebSocketHandler.cs#L248-L251
|
||||||
Running = Task.WhenAll(sendTask, receiveTask).ContinueWith(t =>
|
Running = Task.WhenAll(sendTask, receiveTask).ContinueWith(t =>
|
||||||
{
|
{
|
||||||
|
_webSocket.Dispose();
|
||||||
_logger.TransportStopped(_connectionId, t.Exception?.InnerException);
|
_logger.TransportStopped(_connectionId, t.Exception?.InnerException);
|
||||||
_application.Out.TryComplete(t.IsFaulted ? t.Exception.InnerException : null);
|
_application.Out.TryComplete(t.IsFaulted ? t.Exception.InnerException : null);
|
||||||
return t;
|
return t;
|
||||||
|
|
@ -221,7 +222,6 @@ namespace Microsoft.AspNetCore.Sockets.Client
|
||||||
_logger.TransportStopping(_connectionId);
|
_logger.TransportStopping(_connectionId);
|
||||||
|
|
||||||
await CloseWebSocket();
|
await CloseWebSocket();
|
||||||
_webSocket.Dispose();
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|
@ -242,7 +242,13 @@ namespace Microsoft.AspNetCore.Sockets.Client
|
||||||
if (_webSocket.State != WebSocketState.Closed)
|
if (_webSocket.State != WebSocketState.Closed)
|
||||||
{
|
{
|
||||||
_logger.ClosingWebSocket(_connectionId);
|
_logger.ClosingWebSocket(_connectionId);
|
||||||
await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, null, CancellationToken.None);
|
|
||||||
|
// We intentionally don't pass _transportCts.Token to CloseOutputAsync. The token can be cancelled
|
||||||
|
// for reasons not related to webSocket in which case we would not close the websocket gracefully.
|
||||||
|
await _webSocket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, null, CancellationToken.None);
|
||||||
|
|
||||||
|
// shutdown the transport after a timeout in case the server does not send close frame
|
||||||
|
_transportCts.CancelAfter(TimeSpan.FromSeconds(5));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,17 @@ namespace Microsoft.AspNetCore.SignalR.Tests
|
||||||
_serverFixture = serverFixture;
|
_serverFixture = serverFixture;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task CanStartConnectionUsingDefaultTransport()
|
||||||
|
{
|
||||||
|
var url = _serverFixture.BaseUrl + "/echo";
|
||||||
|
// The test should connect to the server using WebSockets transport on Windows 8 and newer.
|
||||||
|
// On Windows 7/2008R2 it should use ServerSentEvents transport to connect to the server.
|
||||||
|
var connection = new HttpConnection(new Uri(url));
|
||||||
|
await connection.StartAsync().OrTimeout();
|
||||||
|
await connection.DisposeAsync().OrTimeout();
|
||||||
|
}
|
||||||
|
|
||||||
[ConditionalFact]
|
[ConditionalFact]
|
||||||
[OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, WindowsVersions.Win2008R2, SkipReason = "No WebSockets Client for this platform")]
|
[OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, WindowsVersions.Win2008R2, SkipReason = "No WebSockets Client for this platform")]
|
||||||
public async Task WebSocketsTest()
|
public async Task WebSocketsTest()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue