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