diff --git a/src/Microsoft.AspNetCore.Sockets.Client/DefaultTransportFactory.cs b/src/Microsoft.AspNetCore.Sockets.Client/DefaultTransportFactory.cs index a9266c240f..f450fe8965 100644 --- a/src/Microsoft.AspNetCore.Sockets.Client/DefaultTransportFactory.cs +++ b/src/Microsoft.AspNetCore.Sockets.Client/DefaultTransportFactory.cs @@ -12,6 +12,7 @@ namespace Microsoft.AspNetCore.Sockets.Client private readonly HttpClient _httpClient; private readonly TransportType _requestedTransportType; private readonly ILoggerFactory _loggerFactory; + private static volatile bool _websocketsSupported = true; public DefaultTransportFactory(TransportType requestedTransportType, ILoggerFactory loggerFactory, HttpClient httpClient) { @@ -32,9 +33,16 @@ namespace Microsoft.AspNetCore.Sockets.Client public ITransport CreateTransport(TransportType availableServerTransports) { - if ((availableServerTransports & TransportType.WebSockets & _requestedTransportType) == TransportType.WebSockets) + if (_websocketsSupported && (availableServerTransports & TransportType.WebSockets & _requestedTransportType) == TransportType.WebSockets) { - return new WebSocketsTransport(_loggerFactory); + try + { + return new WebSocketsTransport(_loggerFactory); + } + catch (PlatformNotSupportedException) + { + _websocketsSupported = false; + } } if ((availableServerTransports & TransportType.ServerSentEvents & _requestedTransportType) == TransportType.ServerSentEvents) diff --git a/test/Microsoft.AspNetCore.SignalR.Tests/DefaultTransportFactoryTests.cs b/test/Microsoft.AspNetCore.SignalR.Tests/DefaultTransportFactoryTests.cs index 604b8411ae..0e40c662cc 100644 --- a/test/Microsoft.AspNetCore.SignalR.Tests/DefaultTransportFactoryTests.cs +++ b/test/Microsoft.AspNetCore.SignalR.Tests/DefaultTransportFactoryTests.cs @@ -5,6 +5,7 @@ using System; using System.Net.Http; using Microsoft.AspNetCore.Sockets; using Microsoft.AspNetCore.Sockets.Client; +using Microsoft.AspNetCore.Testing.xunit; using Microsoft.Extensions.Logging; using Xunit; @@ -33,6 +34,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests [Theory] [InlineData(TransportType.WebSockets, typeof(WebSocketsTransport))] [InlineData(TransportType.LongPolling, typeof(LongPollingTransport))] + [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, WindowsVersions.Win2008R2, SkipReason = "No WebSockets Client for this platform")] public void DefaultTransportFactoryCreatesRequestedTransportIfAvailable(TransportType requestedTransport, Type expectedTransportType) { var transportFactory = new DefaultTransportFactory(requestedTransport, loggerFactory: null, httpClient: new HttpClient()); @@ -56,11 +58,39 @@ namespace Microsoft.AspNetCore.SignalR.Tests } [Fact] + [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, WindowsVersions.Win2008R2, SkipReason = "No WebSockets Client for this platform")] public void DefaultTransportFactoryCreatesWebSocketsTransportIfAvailable() { Assert.IsType( new DefaultTransportFactory(TransportType.All, loggerFactory: null, httpClient: new HttpClient()) .CreateTransport(TransportType.All)); } + + [Theory] + [InlineData(TransportType.WebSockets, typeof(LongPollingTransport))] + [InlineData(TransportType.LongPolling, typeof(LongPollingTransport))] + public void DefaultTransportFactoryCreatesRequestedTransportIfAvailable_Win7(TransportType requestedTransport, Type expectedTransportType) + { + if (!WebsocketsSupported()) + { + var transportFactory = new DefaultTransportFactory(requestedTransport, loggerFactory: null, httpClient: new HttpClient()); + Assert.IsType(expectedTransportType, + transportFactory.CreateTransport(TransportType.All)); + } + } + + private bool WebsocketsSupported() + { + try + { + new System.Net.WebSockets.ClientWebSocket(); + } + catch (PlatformNotSupportedException) + { + return false; + } + + return true; + } } }