TransportFactory should not try creating WebSocket transport on Win7/2008R2

This commit is contained in:
moozzyk 2017-04-11 15:52:21 -07:00
parent a181dc558a
commit db66b1e553
2 changed files with 40 additions and 2 deletions

View File

@ -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)

View File

@ -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<WebSocketsTransport>(
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;
}
}
}