From 87efa8c7dcce1ace1cae8edf548ce20ce88e89e2 Mon Sep 17 00:00:00 2001 From: dudu Date: Tue, 25 Feb 2020 19:57:46 +0800 Subject: [PATCH] Workaround for PlatformNotSupportedException on linux with .net core 2.1 --- Enyim.Caching/Memcached/PooledSocket.cs | 61 ++++++++++++++++++++----- 1 file changed, 49 insertions(+), 12 deletions(-) diff --git a/Enyim.Caching/Memcached/PooledSocket.cs b/Enyim.Caching/Memcached/PooledSocket.cs index abb8a5f9..97e498ff 100755 --- a/Enyim.Caching/Memcached/PooledSocket.cs +++ b/Enyim.Caching/Memcached/PooledSocket.cs @@ -65,7 +65,15 @@ void Cancel() } cts.Token.Register(Cancel); - _socket.Connect(_endpoint); + try + { + _socket.Connect(_endpoint); + } + catch (PlatformNotSupportedException) + { + var ep = GetIPEndPoint(_endpoint); + _socket.Connect(ep.Address, ep.Port); + } if (_socket != null) { @@ -94,20 +102,28 @@ public async Task ConnectAsync() { bool success = false; - var connTask = _socket.ConnectAsync(_endpoint); - - if (await Task.WhenAny(connTask, Task.Delay(_connectionTimeout)) == connTask) - { - await connTask; - } - else + try { - if (_socket != null) + var connTask = _socket.ConnectAsync(_endpoint); + + if (await Task.WhenAny(connTask, Task.Delay(_connectionTimeout)) == connTask) { - _socket.Dispose(); - _socket = null; + await connTask; } - throw new TimeoutException($"Timeout to connect to {_endpoint}."); + else + { + if (_socket != null) + { + _socket.Dispose(); + _socket = null; + } + throw new TimeoutException($"Timeout to connect to {_endpoint}."); + } + } + catch (PlatformNotSupportedException) + { + var ep = GetIPEndPoint(_endpoint); + await _socket.ConnectAsync(ep.Address, ep.Port); } if (_socket != null) @@ -423,6 +439,27 @@ public async Task WriteAsync(IList> buffers) throw; } } + + private IPEndPoint GetIPEndPoint(EndPoint endpoint) + { + if (endpoint is DnsEndPoint) + { + var dnsEndPoint = (DnsEndPoint)endpoint; + var address = Dns.GetHostAddresses(dnsEndPoint.Host).FirstOrDefault(ip => + ip.AddressFamily == AddressFamily.InterNetwork); + if (address == null) + throw new ArgumentException(String.Format("Could not resolve host '{0}'.", endpoint)); + return new IPEndPoint(address, dnsEndPoint.Port); + } + else if (endpoint is IPEndPoint) + { + return endpoint as IPEndPoint; + } + else + { + throw new Exception("Not supported EndPoint type"); + } + } } }