diff --git a/CrystalConnector/CrystalConnector.csproj b/CrystalConnector/CrystalConnector.csproj
index a3c16b2..860f7d1 100644
--- a/CrystalConnector/CrystalConnector.csproj
+++ b/CrystalConnector/CrystalConnector.csproj
@@ -8,19 +8,19 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
+
@@ -32,9 +32,4 @@
-
-
-
-
-
diff --git a/CrystalConnector/Handlers/IWebSocketHandler.cs b/CrystalConnector/Handlers/IWebSocketHandler.cs
new file mode 100644
index 0000000..24ecbc0
--- /dev/null
+++ b/CrystalConnector/Handlers/IWebSocketHandler.cs
@@ -0,0 +1,11 @@
+using System.Net.WebSockets;
+using Microsoft.AspNetCore.Http;
+
+namespace CrystalConnector.Handlers;
+
+public interface IWebSocketHandler
+{
+ public void StartHandle(HttpContext context, WebSocket socket, TaskCompletionSource taskCompletionSource);
+
+ public void Disconnect(WebSocket socket);
+}
\ No newline at end of file
diff --git a/CrystalConnector/Handlers/WebSocketHandleResult.cs b/CrystalConnector/Handlers/WebSocketHandleResult.cs
new file mode 100644
index 0000000..9570370
--- /dev/null
+++ b/CrystalConnector/Handlers/WebSocketHandleResult.cs
@@ -0,0 +1,6 @@
+namespace CrystalConnector.Handlers;
+
+public enum WebSocketHandleResult
+{
+ Successful = 0
+}
\ No newline at end of file
diff --git a/CrystalConnector/Handlers/WebSocketHandler.cs b/CrystalConnector/Handlers/WebSocketHandler.cs
new file mode 100644
index 0000000..f8f14de
--- /dev/null
+++ b/CrystalConnector/Handlers/WebSocketHandler.cs
@@ -0,0 +1,30 @@
+using System.Net;
+using System.Net.WebSockets;
+using Microsoft.AspNetCore.Http;
+using Microsoft.Extensions.Logging;
+
+namespace CrystalConnector.Handlers;
+
+public class WebSocketHandler : IWebSocketHandler
+{
+ private ILogger Logger { get; }
+
+ // Todo: qyl27: Maybe we need a MultiKeyMap? >>
+ private Dictionary>> WebSockets { get; } = new();
+
+ public WebSocketHandler(ILogger logger)
+ {
+ Logger = logger;
+ }
+
+ public void StartHandle(HttpContext context, WebSocket socket, TaskCompletionSource taskCompletionSource)
+ {
+ var remoteEndPoint = new IPEndPoint(context.Connection.RemoteIpAddress, context.Connection.RemotePort);
+ WebSockets.Add(remoteEndPoint, new Tuple>(socket, taskCompletionSource));
+ }
+
+ public void Disconnect(WebSocket socket)
+ {
+
+ }
+}
\ No newline at end of file
diff --git a/CrystalConnector/Program.cs b/CrystalConnector/Program.cs
index 44fcd66..89ee558 100644
--- a/CrystalConnector/Program.cs
+++ b/CrystalConnector/Program.cs
@@ -1,6 +1,7 @@
using System.Net;
using System.Security.Cryptography.X509Certificates;
using CrystalConnector;
+using CrystalConnector.Handlers;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
@@ -14,6 +15,8 @@ var builder = Host.CreateDefaultBuilder(args);
builder.ConfigureServices(services =>
{
services.AddHostedService();
+
+ ConfigureServices(services);
});
builder.ConfigureAppConfiguration((context, config) =>
@@ -27,15 +30,13 @@ builder.ConfigureAppConfiguration((context, config) =>
builder.UseContentRoot(Environment.CurrentDirectory);
-builder.ConfigureLogging(logging =>
-{
- logging.ClearProviders()
- .SetMinimumLevel(LogLevel.Trace)
- .AddNLog();
-});
+builder.ConfigureLogging(ConfigureLogging);
builder.ConfigureWebHost(webHost =>
{
+ webHost.ConfigureServices(ConfigureServices);
+ webHost.ConfigureLogging(ConfigureLogging);
+
webHost.UseStartup();
webHost.UseKestrel();
@@ -81,3 +82,15 @@ builder.ConfigureWebHost(webHost =>
using var host = builder.Build();
await host.RunAsync();
+
+void ConfigureLogging(ILoggingBuilder logging)
+{
+ logging.ClearProviders()
+ .SetMinimumLevel(LogLevel.Trace)
+ .AddNLog();
+}
+
+void ConfigureServices(IServiceCollection services)
+{
+ services.AddSingleton();
+}
diff --git a/CrystalConnector/Startup.cs b/CrystalConnector/Startup.cs
index 773d7a0..7244349 100644
--- a/CrystalConnector/Startup.cs
+++ b/CrystalConnector/Startup.cs
@@ -1,15 +1,17 @@
-using Microsoft.AspNetCore.Builder;
+using CrystalConnector.Handlers;
+using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
-using NLog;
+using Microsoft.Extensions.Logging;
namespace CrystalConnector;
public class Startup
{
private IConfiguration Config { get; }
-
- private Logger Logger { get; } = LogManager.GetCurrentClassLogger();
+
+ private ILogger Logger { get; set; }
+ private IWebSocketHandler WebSocketHandler { get; set; }
public Startup(IConfiguration config)
{
@@ -18,6 +20,10 @@ public class Startup
public void ConfigureServices(IServiceCollection services)
{
+ var provider = services.BuildServiceProvider();
+
+ Logger = provider.GetService>()!;
+ WebSocketHandler = provider.GetService()!;
}
public void Configure(IApplicationBuilder app)
@@ -28,11 +34,17 @@ public class Startup
{
if (context.WebSockets.IsWebSocketRequest)
{
- await context.WebSockets.AcceptWebSocketAsync();
- Logger.Info("Got WebSocket connection from {Ip}:{Port}", context.Connection.RemoteIpAddress?.ToString(), context.Connection.RemotePort);
- }
+ var websocket = await context.WebSockets.AcceptWebSocketAsync();
+ Logger.LogInformation("Got WebSocket connection from {Ip}:{Port}", context.Connection.RemoteIpAddress?.ToString(), context.Connection.RemotePort);
- await next(context);
+ var taskCompletionSource = new TaskCompletionSource();
+ WebSocketHandler.StartHandle(context, websocket, taskCompletionSource);
+ await taskCompletionSource.Task;
+ }
+ else
+ {
+ await next(context);
+ }
});
}
}
\ No newline at end of file