using System; using System.Collections.Concurrent; using System.Net.WebSockets; using System.Threading; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting; using Yavsc.Extensions; namespace Yavsc { public partial class Startup { public static ConcurrentBag Listeners = new ConcurrentBag(); public void ConfigureWebSocketsApp(IApplicationBuilder app, SiteSettings siteSettings, IHostingEnvironment env) { app.UseWebSockets(); app.UseSignalR("/api/signalr"); app.UseWhen(context => context.Request.Path.StartsWithSegments("/ws"), branch => { branch.Use( async (http, next) => { if (http.WebSockets.IsWebSocketRequest) { WebSocket webSocket = null; if (!Listeners.TryPeek(out webSocket)) { webSocket = await http.WebSockets.AcceptWebSocketAsync(); Listeners.Add(webSocket); } using (webSocket) { if (webSocket != null && webSocket.State == WebSocketState.Open) { // TODO: Handle the socket here. byte[] buffer = new byte[1024]; WebSocketReceiveResult received = await webSocket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None); while (received.MessageType != WebSocketMessageType.Close) { Console.WriteLine($"Echoing {received.Count} bytes received in a {received.MessageType} message; Fin={received.EndOfMessage}"); // Echo anything we receive await webSocket.SendAsync(new ArraySegment(buffer, 0, received.Count), received.MessageType, received.EndOfMessage, CancellationToken.None); received = await webSocket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None); } await webSocket.CloseAsync(received.CloseStatus.Value, received.CloseStatusDescription, CancellationToken.None); } } } else { // Nothing to do here, pass downstream. await next(); } } ); } ); /* var _sockets = new ConcurrentBag(); app.Use( async (http, next) => { if (http.WebSockets.IsWebSocketRequest) { WebSocket webSocket = null; if (!_sockets.TryPeek(out webSocket)) { webSocket = await http.WebSockets.AcceptWebSocketAsync(); _sockets.Add(webSocket); } using (webSocket) { if (webSocket != null && webSocket.State == WebSocketState.Open) { // TODO: Handle the socket here. byte[] buffer = new byte[1024]; WebSocketReceiveResult received = await webSocket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None); while (received.MessageType != WebSocketMessageType.Close) { Console.WriteLine($"Echoing {received.Count} bytes received in a {received.MessageType} message; Fin={received.EndOfMessage}"); // Echo anything we receive await webSocket.SendAsync(new ArraySegment(buffer, 0, received.Count), received.MessageType, received.EndOfMessage, CancellationToken.None); received = await webSocket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None); } await webSocket.CloseAsync(received.CloseStatus.Value, received.CloseStatusDescription, CancellationToken.None); } } } else { // Nothing to do here, pass downstream. await next(); } } ); */ } } }