public async Task InvokeAsync(HttpContext context) { // Only allow handshake on /ws if (context.Request.Path != "/ws") { await _next(context); return; } // Check if it's actually a WebSocket if (!context.WebSockets.IsWebSocketRequest) { _log.LogDebug("Skipping WebSocket handshake request, not an actual WebSocket"); await _next(context); return; } // Check protocols var protocols = context.WebSockets.WebSocketRequestedProtocols; var isFrontend = protocols.Contains("EliteAPI-app"); var isPlugin = protocols.Contains("EliteAPI-plugin"); var isClient = protocols.Contains("EliteAPI"); if (isFrontend) { // Accept our frontend request _log.LogDebug("Accepting frontend WebSocket handshake"); using var webSocket = await context.WebSockets.AcceptWebSocketAsync("EliteAPI-app"); await _handler.Handle(webSocket, WebSocketType.FrontEnd); } else if (isPlugin) { // Accept our plugin request _log.LogDebug("Accepting plugin WebSocket handshake"); using var webSocket = await context.WebSockets.AcceptWebSocketAsync("EliteAPI-plugin"); await _handler.Handle(webSocket, WebSocketType.Plugin); } else if (isClient) { // Accept our client request _log.LogDebug("Accepting client WebSocket handshake"); using var webSocket = await context.WebSockets.AcceptWebSocketAsync("EliteAPI"); await _handler.Handle(webSocket, WebSocketType.Client); } else { _log.LogDebug("Bad WebSocket handshake request, bad protocol"); context.Response.StatusCode = (int)HttpStatusCode.Unauthorized; } }
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env, WebSocketHandler webSocketHandler) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseWebSockets(); app.Use(async(context, next) => { if (context.WebSockets.IsWebSocketRequest) { var webSocket = await context.WebSockets.AcceptWebSocketAsync(); webSocketHandler.Handle(webSocket); } else { await next(); } }); app.UseMvcWithDefaultRoute(); app.UseStaticFiles(); }
public async Task Get() { if (HttpContext.WebSockets.IsWebSocketRequest) { WebSocket webSocket = await HttpContext.WebSockets.AcceptWebSocketAsync(); await _webSocketHandler.Handle(Guid.NewGuid(), webSocket); //await SendMessages(webSocket); } else { HttpContext.Response.StatusCode = 400; } }