示例#1
0
 public WebSocketConnection(WebSocket socket, IWebSocketCompressionProvider socketCompressionProvider, ITextWebSocketSubProtocol textSubProtocol, int receivePayloadBufferSize)
 {
     _webSocket = socket ?? throw new ArgumentNullException(nameof(socket));
     _webSocketCompressionProvider = socketCompressionProvider ?? throw new ArgumentNullException(nameof(socketCompressionProvider));
     _textSubProtocol          = textSubProtocol ?? throw new ArgumentNullException(nameof(textSubProtocol));
     _receivePayloadBufferSize = receivePayloadBufferSize;
 }
        public async Task Invoke(HttpContext context)
        {
            if (context.WebSockets.IsWebSocketRequest)
            {
                if (ValidateOrigin(context))
                {
                    ITextWebSocketSubprotocol textSubProtocol = NegotiateSubProtocol(context.WebSockets.WebSocketRequestedProtocols);

                    IWebSocketCompressionProvider webSocketCompressionProvider = _compressionService.NegotiateCompression(context);

                    WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync(textSubProtocol?.SubProtocol);

                    WebSocketConnection webSocketConnection = new WebSocketConnection(webSocket, webSocketCompressionProvider, textSubProtocol ?? _options.DefaultSubProtocol, _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 virtual Task SendAsync(string message, WebSocket webSocket, IWebSocketCompressionProvider webSocketCompressionProvider, CancellationToken cancellationToken)
 {
     return(webSocketCompressionProvider.CompressTextMessageAsync(webSocket, message, cancellationToken));
 }
        public override Task SendAsync(string message, WebSocket socket, IWebSocketCompressionProvider socketCompressionProvider, CancellationToken cancellationToken)
        {
            var jsonMessage = JsonConvert.SerializeObject(new { message, timestamp = DateTime.UtcNow });

            return(base.SendAsync(jsonMessage, socket, socketCompressionProvider, cancellationToken));
        }