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;
            }
        }
Exemple #6
0
 public WebSocketConnection(WebSocket webSocket, ITextWebSocketSubprotocol subProtocol)
 {
     _webSocket   = webSocket ?? throw new ArgumentNullException(nameof(webSocket));
     _subProtocol = subProtocol ?? throw new ArgumentNullException(nameof(subProtocol));
 }