public void MapHub <THub>(string path, Format format) where THub : Hub { _app.UseRouter(rb => { rb.MapRoute($"{path}", (RequestDelegate)(async context => { //var identity = (ClaimsIdentity)context.User.Identity; //var email = identity.IsAuthenticated ? identity.Claims.First(c => c.Type == ClaimTypes.Email).Value : "no email"; if (context.WebSockets.IsWebSocketRequest) { var webSocket = await context.WebSockets.AcceptWebSocketAsync(); var connectionId = context.Request.Query.ContainsKey("connectionId") ? (string)context.Request.Query["connectionId"] : Guid.NewGuid().ToString(); var channel = new WsChannel(webSocket, format); var connection = new Connection { User = context.User, Channel = channel, ConnectionId = connectionId }; connection.Metadata.Format = format; // TODO check existing connection by ID, User must match on reconnect // now pass this connection to a method that starts processing var endpoint = context.RequestServices.GetRequiredService <HubEndPoint <THub> >(); var processingTask = endpoint.OnConnectedAsync(connection); await Task.WhenAll(processingTask, connection.Channel.Completion); return; } context.Response.StatusCode = StatusCodes.Status403Forbidden; })); }); }
public static void Main(string[] args) { Console.WriteLine("Websocket Client"); Console.WriteLine("Enter URI of websocket server to connect to"); while (_WsChannel == null) { var input = Console.ReadLine(); bool validURI = Uri.TryCreate(input, UriKind.Absolute, out Uri uri); if (validURI == false) { Console.WriteLine("Uri you entered isn't valid"); continue; } var task = Task.Run(async() => await TryConnect(2000, uri)); task.Wait(); KeyValuePair <bool, WebSocket> connected = task.Result; if (connected.Key == false) { Console.WriteLine("Connection failed"); continue; } Console.WriteLine("Connected"); _WsChannel = new WsChannel(connected.Value, Format.Text); } Task.Run(async() => { while (true) { var stream = await _WsChannel.ReadAsync(); RecyclableMemoryStream rs = stream as RecyclableMemoryStream; if (stream == null) { break; } byte[] buffer = new byte[rs.Length]; rs.Position = 0; rs.Read(buffer, 0, (int)rs.Length); var message = Encoding.UTF8.GetString(buffer); Console.WriteLine($"Arrived Message: {message}"); } }); Console.WriteLine("Enter Messages to send to server. Enter q to Quit"); while (true) { string input = Console.ReadLine(); if (input == "q") { break; } var data = Encoding.UTF8.GetBytes(input); MemoryStream stream = RecyclableMemoryStreamManager.Default.GetStream("userInput", data.Length, true); stream.Write(data, 0, data.Length); var writeTask = Task.Run(async() => await _WsChannel.WriteAsync(stream)); writeTask.Wait(); stream.Dispose(); } }