diff --git a/src/Microsoft.AspNetCore.Sockets.Client.Http/HttpConnection.Log.cs b/src/Microsoft.AspNetCore.Sockets.Client.Http/HttpConnection.Log.cs index 9e0d56da7c..814389dc74 100644 --- a/src/Microsoft.AspNetCore.Sockets.Client.Http/HttpConnection.Log.cs +++ b/src/Microsoft.AspNetCore.Sockets.Client.Http/HttpConnection.Log.cs @@ -62,6 +62,9 @@ namespace Microsoft.AspNetCore.Sockets.Client.Http private static readonly Action _transportThrewExceptionOnStop = LoggerMessage.Define(LogLevel.Error, new EventId(17, "TransportThrewExceptionOnStop"), "The transport threw an exception while stopping."); + private static readonly Action _transportStarted = + LoggerMessage.Define(LogLevel.Debug, new EventId(18, "TransportStarted"), "Transport '{Transport}' started."); + public static void Starting(ILogger logger) { _starting(logger, null); @@ -161,6 +164,14 @@ namespace Microsoft.AspNetCore.Sockets.Client.Http { _transportThrewExceptionOnStop(logger, ex); } + + public static void TransportStarted(ILogger logger, ITransport transport) + { + if (logger.IsEnabled(LogLevel.Debug)) + { + _transportStarted(logger, transport.GetType().Name, null); + } + } } } } diff --git a/src/Microsoft.AspNetCore.Sockets.Client.Http/HttpConnection.cs b/src/Microsoft.AspNetCore.Sockets.Client.Http/HttpConnection.cs index 80d6bbecf3..e8f98d49d9 100644 --- a/src/Microsoft.AspNetCore.Sockets.Client.Http/HttpConnection.cs +++ b/src/Microsoft.AspNetCore.Sockets.Client.Http/HttpConnection.cs @@ -348,7 +348,7 @@ namespace Microsoft.AspNetCore.Sockets.Client.Http } catch (Exception ex) { - Log.ErrorStartingTransport(_logger, _transport, ex); + Log.ErrorStartingTransport(_logger, transport, ex); _transport = null; throw; } @@ -356,6 +356,8 @@ namespace Microsoft.AspNetCore.Sockets.Client.Http // We successfully started, set the transport properties (we don't want to set these until the transport is definitely running). _transport = transport; _transportPipe = pair.Transport; + + Log.TransportStarted(_logger, _transport); } private HttpClient CreateHttpClient() diff --git a/src/Microsoft.AspNetCore.Sockets.Client.Http/Internal/LongPollingTransport.cs b/src/Microsoft.AspNetCore.Sockets.Client.Http/Internal/LongPollingTransport.cs index a83497dbe3..3b2d533b67 100644 --- a/src/Microsoft.AspNetCore.Sockets.Client.Http/Internal/LongPollingTransport.cs +++ b/src/Microsoft.AspNetCore.Sockets.Client.Http/Internal/LongPollingTransport.cs @@ -93,7 +93,17 @@ namespace Microsoft.AspNetCore.Sockets.Client.Internal _application.Input.CancelPendingRead(); - await Running; + try + { + await Running; + } + catch (Exception ex) + { + Log.TransportStopped(_logger, ex); + throw; + } + + Log.TransportStopped(_logger, null); } private async Task Poll(Uri pollUrl, CancellationToken cancellationToken) diff --git a/src/Microsoft.AspNetCore.Sockets.Client.Http/Internal/ServerSentEventsTransport.cs b/src/Microsoft.AspNetCore.Sockets.Client.Http/Internal/ServerSentEventsTransport.cs index e0c4041a43..0d2b374408 100644 --- a/src/Microsoft.AspNetCore.Sockets.Client.Http/Internal/ServerSentEventsTransport.cs +++ b/src/Microsoft.AspNetCore.Sockets.Client.Http/Internal/ServerSentEventsTransport.cs @@ -200,7 +200,17 @@ namespace Microsoft.AspNetCore.Sockets.Client.Internal _application.Input.CancelPendingRead(); - await Running; + try + { + await Running; + } + catch (Exception ex) + { + Log.TransportStopped(_logger, ex); + throw; + } + + Log.TransportStopped(_logger, null); } } } diff --git a/src/Microsoft.AspNetCore.Sockets.Client.Http/Internal/WebSocketsTransport.cs b/src/Microsoft.AspNetCore.Sockets.Client.Http/Internal/WebSocketsTransport.cs index f833185d67..f569625849 100644 --- a/src/Microsoft.AspNetCore.Sockets.Client.Http/Internal/WebSocketsTransport.cs +++ b/src/Microsoft.AspNetCore.Sockets.Client.Http/Internal/WebSocketsTransport.cs @@ -348,10 +348,14 @@ namespace Microsoft.AspNetCore.Sockets.Client.Internal { await Running; } - catch + catch (Exception ex) { + Log.TransportStopped(_logger, ex); // exceptions have been handled in the Running task continuation by closing the channel with the exception + return; } + + Log.TransportStopped(_logger, null); } } } diff --git a/test/Microsoft.AspNetCore.SignalR.Tests/EndToEndTests.cs b/test/Microsoft.AspNetCore.SignalR.Tests/EndToEndTests.cs index 2b66967adf..070821f81d 100644 --- a/test/Microsoft.AspNetCore.SignalR.Tests/EndToEndTests.cs +++ b/test/Microsoft.AspNetCore.SignalR.Tests/EndToEndTests.cs @@ -197,11 +197,11 @@ namespace Microsoft.AspNetCore.SignalR.Tests } } - [Theory(Skip = "https://github.com/aspnet/SignalR/issues/1485")] + [Theory] [MemberData(nameof(TransportTypesAndTransferFormats))] public async Task ConnectionCanSendAndReceiveMessages(TransportType transportType, TransferFormat requestedTransferFormat) { - using (StartLog(out var loggerFactory, testName: $"ConnectionCanSendAndReceiveMessages_{transportType.ToString()}")) + using (StartLog(out var loggerFactory, minLogLevel: LogLevel.Trace, testName: $"ConnectionCanSendAndReceiveMessages_{transportType.ToString()}_{requestedTransferFormat.ToString()}")) { var logger = loggerFactory.CreateLogger(); @@ -230,10 +230,11 @@ namespace Microsoft.AspNetCore.SignalR.Tests // Our solution to this is to just catch OperationCanceledException from the sent message if the race happens // because we know the send went through, and its safe to check the response. } + logger.LogInformation("Sent message"); logger.LogInformation("Receiving message"); - Assert.Equal(message, Encoding.UTF8.GetString(await connection.Transport.Input.ReadAsync(bytes.Length))); + Assert.Equal(message, Encoding.UTF8.GetString(await connection.Transport.Input.ReadAsync(bytes.Length).OrTimeout())); logger.LogInformation("Completed receive"); } catch (Exception ex)