public async Task Invoke(HttpContext context) { if (context.WebSockets.IsWebSocketRequest) { ITextWebSocketSubprotocol subProtocol = NegotiateSubProtocol(context.WebSockets.WebSocketRequestedProtocols); WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync(subProtocol?.SubProtocol); WebSocketConnection webSocketConnection = new WebSocketConnection(webSocket, subProtocol ?? _options.DefaultSubProtocol); _connectionsService.AddConnection(webSocketConnection); byte[] webSocketBuffer = new byte[1024 * 4]; WebSocketReceiveResult webSocketReceiveResult = await webSocket.ReceiveAsync(new ArraySegment <byte>(webSocketBuffer), CancellationToken.None); if (webSocketReceiveResult.MessageType != WebSocketMessageType.Close) { throw new NotSupportedException("This demo doesn't support receiving data."); } await webSocket.CloseAsync(webSocketReceiveResult.CloseStatus.Value, webSocketReceiveResult.CloseStatusDescription, CancellationToken.None); _connectionsService.RemoveConnection(webSocketConnection.Id); } else { context.Response.StatusCode = 400; } }
public WebSocketConnection(WebSocket webSocket, ITextWebSocketSubprotocol textSubProtocol, int?sendSegmentSize, int receivePayloadBufferSize) { _webSocket = webSocket ?? throw new ArgumentNullException(nameof(webSocket)); _textSubProtocol = textSubProtocol ?? throw new ArgumentNullException(nameof(textSubProtocol)); _sendSegmentSize = sendSegmentSize; _receivePayloadBufferSize = receivePayloadBufferSize; }
public WebSocketConnection(WebSocket webSocket, IWebSocketCompressionProvider webSocketCompressionProvider, ITextWebSocketSubprotocol textSubProtocol, int receivePayloadBufferSize) { _webSocket = webSocket ?? throw new ArgumentNullException(nameof(webSocket)); _webSocketCompressionProvider = webSocketCompressionProvider ?? throw new ArgumentNullException(nameof(webSocketCompressionProvider)); _textSubProtocol = textSubProtocol ?? throw new ArgumentNullException(nameof(textSubProtocol)); _receivePayloadBufferSize = receivePayloadBufferSize; }
private ITextWebSocketSubprotocol NegotiateSubProtocol(IList <string> requestedSubProtocols) { ITextWebSocketSubprotocol subProtocol = null; foreach (ITextWebSocketSubprotocol supportedSubProtocol in _options.SupportedSubProtocols) { if (requestedSubProtocols.Contains(supportedSubProtocol.SubProtocol)) { subProtocol = supportedSubProtocol; break; } } return(subProtocol); }
public async Task Invoke(HttpContext context) { if (context.WebSockets.IsWebSocketRequest) { if (ValidateOrigin(context)) { ITextWebSocketSubprotocol textSubProtocol = NegotiateSubProtocol(context.WebSockets.WebSocketRequestedProtocols); WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync(new WebSocketAcceptContext { SubProtocol = textSubProtocol?.SubProtocol, DangerousEnableCompression = true }); WebSocketConnection webSocketConnection = new WebSocketConnection(webSocket, textSubProtocol ?? _options.DefaultSubProtocol, _options.SendSegmentSize, _options.ReceivePayloadBufferSize); webSocketConnection.ReceiveText += async(sender, message) => { await webSocketConnection.SendAsync(message, CancellationToken.None); }; _connectionsService.AddConnection(webSocketConnection); await webSocketConnection.ReceiveMessagesUntilCloseAsync(); if (webSocketConnection.CloseStatus.HasValue) { await webSocket.CloseAsync(webSocketConnection.CloseStatus.Value, webSocketConnection.CloseStatusDescription, CancellationToken.None); } _connectionsService.RemoveConnection(webSocketConnection.Id); } else { context.Response.StatusCode = StatusCodes.Status403Forbidden; } } else { context.Response.StatusCode = StatusCodes.Status400BadRequest; } }
public WebSocketConnection(WebSocket webSocket, ITextWebSocketSubprotocol subProtocol) { _webSocket = webSocket ?? throw new ArgumentNullException(nameof(webSocket)); _subProtocol = subProtocol ?? throw new ArgumentNullException(nameof(subProtocol)); }