Skip to content

Commit eb40282

Browse files
gedemgedem
authored andcommitted
TryConnectAsync (task) extension, Log dependencies, bug fixes
1 parent 2190869 commit eb40282

File tree

9 files changed

+122
-22
lines changed

9 files changed

+122
-22
lines changed

src/NetCoreStack.WebSockets.ProxyClient/ClientWebSocketConnector.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,15 @@ private async Task TryConnectAsync()
5353
var uri = new Uri($"ws://{Options.WebSocketHostAddress}");
5454
_webSocket = new ClientWebSocket();
5555
_webSocket.Options.SetRequestHeader(SocketsConstants.ConnectorName, Options.ConnectorName);
56-
await _webSocket.ConnectAsync(uri, CancellationToken.None);
56+
try
57+
{
58+
await _webSocket.ConnectAsync(uri, CancellationToken.None);
59+
}
60+
catch (Exception ex)
61+
{
62+
ProxyLogHelper.Log(_loggerFactory, Options, "Error", ex);
63+
return;
64+
}
5765
var receiverContext = new WebSocketReceiverContext
5866
{
5967
Compressor = _compressor,
@@ -76,7 +84,7 @@ public async Task ConnectAsync()
7684
}
7785
catch (Exception ex)
7886
{
79-
ProxyLogHelper.Log(_loggerFactory, Options, ex);
87+
ProxyLogHelper.Log(_loggerFactory, Options, "Error", ex);
8088
}
8189
finally
8290
{
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
using Microsoft.Extensions.DependencyInjection;
2+
using Microsoft.Extensions.Logging;
3+
using System;
4+
using System.Threading.Tasks;
5+
6+
namespace NetCoreStack.WebSockets.ProxyClient.Console
7+
{
8+
public static class ConsoleApplicationBuilderExtensions
9+
{
10+
public static IServiceProvider UseProxyWebSocket(this IServiceProvider services)
11+
{
12+
var loggerFactory = services.GetService<ILoggerFactory>();
13+
if (loggerFactory == null)
14+
loggerFactory = new LoggerFactory();
15+
16+
var logger = loggerFactory.CreateLogger(nameof(ClientWebSocketConnector));
17+
var webSocketConnector = services.GetService<IWebSocketConnector>();
18+
if (webSocketConnector == null)
19+
throw new ArgumentNullException($"{nameof(webSocketConnector)} please try AddProxyWebSockets");
20+
21+
Task.Run(async () => await webSocketConnector.ConnectAsync());
22+
23+
return services;
24+
}
25+
}
26+
}

src/NetCoreStack.WebSockets.ProxyClient/ProxyLogHelper.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,24 @@ namespace NetCoreStack.WebSockets.Internal
99
{
1010
public static class ProxyLogHelper
1111
{
12-
public static void Log(ILoggerFactory loggerFactory, ProxyOptions options, Exception ex)
12+
public static void Log(ILoggerFactory loggerFactory, ProxyOptions options, string message, Exception ex = null)
1313
{
14+
LogLevel logLevel = LogLevel.Debug;
15+
if (ex != null)
16+
logLevel = LogLevel.Error;
17+
1418
var logger = loggerFactory.CreateLogger<ClientWebSocketConnector>();
15-
logger.Log(options.LogLevel,
19+
var content = $"{message}=={ex?.Message}";
20+
21+
logger.Log(logLevel,
1622
new EventId((int)WebSocketState.Aborted, nameof(WebSocketState.Aborted)),
1723
options,
1824
ex,
1925
(msg, exception) => {
2026

2127
var values = new Dictionary<string, object>();
22-
values.Add(nameof(ex.Message), ex.Message);
28+
values.Add("Message", content);
29+
values.Add(nameof(options.WebSocketHostAddress), options.WebSocketHostAddress);
2330
values.Add(nameof(options.ConnectorName), options.ConnectorName);
2431
return JsonConvert.SerializeObject(values);
2532
});

src/NetCoreStack.WebSockets.ProxyClient/ServiceCollectionExtensions.cs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using Microsoft.Extensions.DependencyInjection;
22
using Microsoft.Extensions.DependencyInjection.Extensions;
3+
using Microsoft.Extensions.Logging;
34
using NetCoreStack.WebSockets.Interfaces;
45
using NetCoreStack.WebSockets.Internal;
56
using System;
@@ -10,9 +11,21 @@ public static class ServiceCollectionExtensions
1011
{
1112
public static void AddProxyWebSockets(this IServiceCollection services, Action<ProxyOptions> setup)
1213
{
14+
if (services == null)
15+
{
16+
throw new ArgumentNullException(nameof(services));
17+
}
18+
19+
if (setup == null)
20+
{
21+
throw new ArgumentNullException(nameof(setup));
22+
}
23+
24+
services.TryAdd(ServiceDescriptor.Singleton<ILoggerFactory, LoggerFactory>());
25+
services.TryAdd(ServiceDescriptor.Singleton<IStreamCompressor, GZipStreamCompressor>());
26+
1327
services.AddTransient<IHandshakeStateTransport, DefaultHandshakeStateTransport>();
1428
services.AddSingleton<IWebSocketConnector, ClientWebSocketConnector>();
15-
services.TryAdd(ServiceDescriptor.Singleton<IStreamCompressor, GZipStreamCompressor>());
1629
InvocatorRegistryHelper.Register(services, setup);
1730
}
1831
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
using System.Threading.Tasks;
2+
using System.Net.WebSockets;
3+
using System.Diagnostics;
4+
5+
namespace NetCoreStack.WebSockets.ProxyClient
6+
{
7+
public static class WebSocketConnectorExtensions
8+
{
9+
private static readonly object _syncLock = new object();
10+
private static Task _currentTask = null;
11+
12+
public static void TryConnectAsync(this IWebSocketConnector connector)
13+
{
14+
if (connector.WebSocketState != WebSocketState.Open)
15+
{
16+
lock (_syncLock)
17+
{
18+
// WebSocket state was not open before we got the lock, check again inside the lock
19+
var isLoop = connector.WebSocketState != WebSocketState.Open;
20+
if (isLoop)
21+
{
22+
if (_currentTask == null)
23+
{
24+
_currentTask = Task.Run(() => connector.ConnectAsync());
25+
}
26+
else
27+
{
28+
if (isLoop && _currentTask.IsCompleted)
29+
{
30+
#if DEBUG
31+
Debug.WriteLine($"==Trying connect: {connector.Options.ConnectorName}==State: {connector.WebSocketState.ToString()}");
32+
#endif
33+
// WebSocket state is not open, so try again the connect
34+
_currentTask = Task.Run(() => connector.ConnectAsync());
35+
}
36+
}
37+
}
38+
}
39+
}
40+
}
41+
}
42+
}

src/NetCoreStack.WebSockets/Extensions/SocketServiceCollectionExtensions.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using Microsoft.Extensions.DependencyInjection;
22
using Microsoft.Extensions.DependencyInjection.Extensions;
3+
using Microsoft.Extensions.Logging;
34
using NetCoreStack.WebSockets.Interfaces;
45
using NetCoreStack.WebSockets.Internal;
56
using System;
@@ -15,6 +16,12 @@ public static void AddNativeWebSockets(this IServiceCollection services, Action<
1516
throw new ArgumentNullException(nameof(services));
1617
}
1718

19+
if (setup == null)
20+
{
21+
throw new ArgumentNullException(nameof(setup));
22+
}
23+
24+
services.TryAdd(ServiceDescriptor.Singleton<ILoggerFactory, LoggerFactory>());
1825
services.TryAdd(ServiceDescriptor.Singleton<IStreamCompressor, GZipStreamCompressor>());
1926
services.TryAdd(ServiceDescriptor.Transient<IHandshakeStateTransport, DefaultHandshakeStateTransport>());
2027
services.AddSingleton<IConnectionManager, ConnectionManager>();

src/NetCoreStack.WebSockets/Internal/LogHelper.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,22 @@ namespace NetCoreStack.WebSockets.Internal
88
{
99
internal class LogHelper
1010
{
11-
internal static void Log(WebSocketReceiverContext context, Exception ex)
11+
internal static void Log(WebSocketReceiverContext context, string message, Exception ex = null)
1212
{
13+
LogLevel logLevel = LogLevel.Debug;
14+
if (ex != null)
15+
logLevel = LogLevel.Error;
16+
1317
var logger = context.LoggerFactory.CreateLogger<WebSocketReceiver>();
14-
logger.Log(context.Options.LogLevel,
18+
var content = $"{message}=={ex?.Message}";
19+
20+
logger.Log(logLevel,
1521
new EventId((int)WebSocketState.Aborted, nameof(WebSocketState.Aborted)),
1622
context.Options,
1723
ex,
1824
(msg, exception) => {
19-
2025
var values = new Dictionary<string, object>();
21-
values.Add(nameof(ex.Message), ex.Message);
26+
values.Add("Message", content);
2227
return JsonConvert.SerializeObject(values);
2328
});
2429
}

src/NetCoreStack.WebSockets/Internal/WebSocketReceiver.cs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ private async Task InternalReceiveAsync()
4444
}
4545
catch (Exception ex)
4646
{
47-
LogHelper.Log(_context, ex);
47+
LogHelper.Log(_context, "Error", ex);
4848
}
4949
result = await _context.WebSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
5050
}
@@ -82,7 +82,7 @@ private async Task InternalReceiveAsync()
8282
}
8383
catch (Exception ex)
8484
{
85-
LogHelper.Log(_context, ex);
85+
LogHelper.Log(_context, "Error", ex);
8686
}
8787
result = await _context.WebSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
8888
}
@@ -99,16 +99,11 @@ public async Task ReceiveAsync()
9999
}
100100
catch (Exception ex)
101101
{
102-
LogHelper.Log(_context, ex);
102+
LogHelper.Log(_context, "Error", ex);
103103
}
104104
finally
105105
{
106-
if (_context.WebSocket.State == WebSocketState.Open ||
107-
_context.WebSocket.State == WebSocketState.Aborted ||
108-
_context.WebSocket.State == WebSocketState.Closed)
109-
{
110-
_closeCallback?.Invoke(_context);
111-
}
106+
_closeCallback?.Invoke(_context);
112107
}
113108
}
114109
}

src/NetCoreStack.WebSockets/SocketsOptions.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using System;
33
using System.Collections.Generic;
44
using System.Linq;
5-
using Microsoft.Extensions.Logging;
65

76
namespace NetCoreStack.WebSockets
87
{
@@ -12,8 +11,6 @@ public class SocketsOptions
1211

1312
public List<Type> Invocators { get; }
1413

15-
public LogLevel LogLevel => LogLevel.Debug;
16-
1714
public SocketsOptions()
1815
{
1916
Map = new List<WebSocketCommandMap>();

0 commit comments

Comments
 (0)