private async Task Echo(HttpContext context, WebSocket webSocket) { // Task.Run(() => Loop(context, webSocket)); var buffer = new byte[1024 * 4]; WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None); while (!result.CloseStatus.HasValue) { Console.WriteLine("Received"); var resultString = Encoding.UTF8.GetString(buffer, 0, result.Count); Console.WriteLine(resultString); var resultJson = JsonConvert.DeserializeObject <Dictionary <string, string> >(resultString); var name = resultJson["name"]; if (resultJson.ContainsKey("play")) { // User plays SocketWatcher.Play(webSocket, resultJson["play"]); await SocketWatcher.SendResultsAll(); } await SocketWatcher.SendMessageAll(result, buffer); // Keep reading result = await webSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None); } Console.WriteLine("Socket closing!"); SocketWatcher.Delete(webSocket); await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); }
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } #if NoOptions app.UseWebSockets(); #endif #if UseOptions var webSocketOptions = new WebSocketOptions() { KeepAliveInterval = TimeSpan.FromSeconds(120), ReceiveBufferSize = 4 * 1024 }; app.UseWebSockets(webSocketOptions); #endif app.UseCors(builder => builder .AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader() // .AllowCredentials() ); app.UseRouting(); app.UseFileServer(); Task.Run(() => SocketWatcher.Run()); app.UseEndpoints(endpoints => { endpoints.MapGet("/status", async(context) => { await context.Response.WriteAsync(SocketWatcher.ListAll()); }); endpoints.MapGet("/ws/{name}", async(context) => { if (context.WebSockets.IsWebSocketRequest) { WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync(); var name = context.GetRouteValue("name"); SocketWatcher.Add(webSocket, name.ToString()); await Echo(context, webSocket); } else { context.Response.StatusCode = 400; } }); }); }