private async Task Echo(HttpContext context, System.Net.WebSockets.WebSocket webSocket) { var buffer = new byte[1024 * 4]; WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None); while (!result.CloseStatus.HasValue) { foreach (System.Net.WebSockets.WebSocket socket in this.webSockets) { await socket.SendAsync( new ArraySegment <byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, CancellationToken.None); } result = await webSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None); } 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) { app.UseWebSockets(); app.Use(async(context, next) => { if (context.Request.Path == "/ws") { if (context.WebSockets.IsWebSocketRequest) { System.Net.WebSockets.WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync(); webSockets.Add(webSocket); await Echo(context, webSocket); } else { context.Response.StatusCode = 400; } } else { await next(); } }); app.UseFileServer(); }