// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Net.WebSockets; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Http; namespace AutobahnTestServer { public class Startup { public void Configure(IApplicationBuilder app) { app.Map("/Managed", managedWebSocketsApp => { // Comment this out to test native server implementations managedWebSocketsApp.UseWebSockets(options => { options.ReplaceFeature = true; }); managedWebSocketsApp.Use(async (context, next) => { if (context.WebSockets.IsWebSocketRequest) { Console.WriteLine("Echo: " + context.Request.Path); var webSocket = await context.WebSockets.AcceptWebSocketAsync(); await Echo(webSocket); return; } await next(); }); }); app.Map("/Native", nativeWebSocketsApp => { nativeWebSocketsApp.Use(async (context, next) => { if (context.WebSockets.IsWebSocketRequest) { Console.WriteLine("Echo: " + context.Request.Path); var webSocket = await context.WebSockets.AcceptWebSocketAsync(); await Echo(webSocket); return; } await next(); }); }); app.Run(context => { Console.WriteLine("Hello World"); return context.Response.WriteAsync("Hello World"); }); } private async Task Echo(WebSocket webSocket) { byte[] buffer = new byte[1024 * 4]; var result = await webSocket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None); while (!result.CloseStatus.HasValue) { await webSocket.SendAsync(new ArraySegment(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, CancellationToken.None); result = await webSocket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None); } await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); } public static void Main(string[] args) { var application = new WebApplicationBuilder() .UseConfiguration(WebApplicationConfiguration.GetDefault(args)) .UseStartup() .Build(); application.Run(); } } }