コード例 #1
0
        /// <summary>
        /// Sends an envelope to
        /// the connected node
        /// </summary>
        /// <param name="envelope">Envelope to be transported</param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        /// <exception cref="System.NotImplementedException"></exception>
        public override async Task SendAsync(Envelope envelope, CancellationToken cancellationToken)
        {
            if (envelope == null)
            {
                throw new ArgumentNullException("envelope");
            }

            if (_stream == null ||
                !_stream.CanWrite)
            {
                throw new InvalidOperationException("Invalid stream state. Call OpenAsync first.");
            }

            var envelopeJson = _envelopeSerializer.Serialize(envelope);

            if (_traceWriter != null &&
                _traceWriter.IsEnabled)
            {
                await _traceWriter.TraceAsync(envelopeJson, DataOperation.Send).ConfigureAwait(false);
            }

            var jsonBytes = Encoding.UTF8.GetBytes(envelopeJson);
            await _sendSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false);

            try
            {
                await _stream.WriteAsync(jsonBytes, 0, jsonBytes.Length, cancellationToken).ConfigureAwait(false);
            }
            finally
            {
                _sendSemaphore.Release();
            }
        }
コード例 #2
0
        public override async Task SendAsync(Envelope envelope, CancellationToken cancellationToken)
        {
            if (envelope == null)
            {
                throw new ArgumentNullException(nameof(envelope));
            }
            if (_clientWebSocket.State != WebSocketState.Open)
            {
                throw new InvalidOperationException("The connection was not initialized. Call OpenAsync first.");
            }

            var envelopeJson = _envelopeSerializer.Serialize(envelope);

            if (_traceWriter != null &&
                _traceWriter.IsEnabled)
            {
                await _traceWriter.TraceAsync(envelopeJson, DataOperation.Send).ConfigureAwait(false);
            }

            var jsonBytes = Encoding.UTF8.GetBytes(envelopeJson);

            await _sendSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false);

            try
            {
                await _clientWebSocket.SendAsync(new ArraySegment <byte>(jsonBytes), WebSocketMessageType.Text, true,
                                                 cancellationToken).ConfigureAwait(false);
            }
            finally
            {
                _sendSemaphore.Release();
            }
        }
コード例 #3
0
        private void HandleReceivedData(RedisChannel channel, RedisValue value)
        {
            var envelopeJson = (string)value;

            _traceWriter.TraceIfEnabledAsync(envelopeJson, DataOperation.Receive).Wait();

            var envelope = _envelopeSerializer.Deserialize(envelopeJson);
            var session  = envelope as Session;

            if (session == null ||
                session.State != SessionState.New)
            {
                _traceWriter.TraceAsync("RedisTransportListener: An unexpected envelope was received", DataOperation.Error).Wait();
            }
            else
            {
                var transport = new RedisTransport(
                    _connectionMultiplexer,
                    _envelopeSerializer,
                    _traceWriter,
                    _channelNamespace,
                    RedisTransport.ClientChannelPrefix,
                    RedisTransport.ServerChannelPrefix);

                _transportBufferBlock.SendAsync(transport).Wait();
                transport.ReceivedEnvelopesBufferBlock.SendAsync(envelope).Wait();
            }
        }
コード例 #4
0
 private Task TraceAsync(string data, DataOperation operation)
 {
     if (_traceWriter == null || !_traceWriter.IsEnabled)
     {
         return(Task.CompletedTask);
     }
     return(_traceWriter.TraceAsync(data, operation));
 }
コード例 #5
0
 private async Task TraceDataIfEnabledAsync(string envelopeJson, DataOperation dataOperation)
 {
     if (_traceWriter != null &&
         _traceWriter.IsEnabled)
     {
         await _traceWriter.TraceAsync(envelopeJson, dataOperation).ConfigureAwait(false);
     }
 }
コード例 #6
0
ファイル: ITraceWriter.cs プロジェクト: ugurak/lime-csharp
 public static Task TraceIfEnabledAsync(this ITraceWriter traceWriter, string data, DataOperation operation)
 {
     if (traceWriter == null || !traceWriter.IsEnabled)
     {
         return(TaskUtil.CompletedTask);
     }
     return(traceWriter.TraceAsync(data, operation));
 }
コード例 #7
0
        public override async Task SendAsync(Envelope envelope, CancellationToken cancellationToken)
        {
            if (envelope == null)
            {
                throw new ArgumentNullException(nameof(envelope));
            }
            if (WebSocket.State != WebSocketState.Open)
            {
                throw new InvalidOperationException("Could not send envelope: websocket is not open");
            }

            var envelopeJson = _envelopeSerializer.Serialize(envelope);

            if (_traceWriter != null &&
                _traceWriter.IsEnabled)
            {
                await _traceWriter.TraceAsync(envelopeJson, DataOperation.Send).ConfigureAwait(false);
            }

            var jsonBytes = Encoding.UTF8.GetBytes(envelopeJson);
            await _sendSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false);

            if (WebSocket.State != WebSocketState.Open)
            {
                throw new InvalidOperationException("Could not send envelope: websocket is not open");
            }

            try
            {
                await WebSocket.SendAsync(new ArraySegment <byte>(jsonBytes), _webSocketMessageType, true,
                                          cancellationToken).ConfigureAwait(false);
            }
            catch (WebSocketException)
            {
                await CloseWithTimeoutAsync().ConfigureAwait(false);

                throw;
            }
            finally
            {
                _sendSemaphore.Release();
            }
        }
コード例 #8
0
        /// <summary>
        /// Submits the response
        /// to the HTTP server.
        /// </summary>
        /// <param name="response">The response.</param>
        /// <returns></returns>
        private async Task SubmitResponseAsync(HttpResponse response)
        {
            Exception exception = null;

            try
            {
                await _httpServer.SubmitResponseAsync(response).ConfigureAwait(false);
            }
            catch (Exception ex)
            {
                exception = ex;
            }

            if (exception != null &&
                _traceWriter != null &&
                _traceWriter.IsEnabled)
            {
                await _traceWriter.TraceAsync("SubmitResponseAsync: " + exception.ToString(), DataOperation.Send).ConfigureAwait(false);
            }
        }
コード例 #9
0
        protected async Task <Document> ParseDocumentAsync(HttpRequest request)
        {
            Document document = null;

            MediaType mediaType;

            if (MediaType.TryParse(request.Headers[HttpRequestHeader.ContentType], out mediaType))
            {
                using (var streamReader = new StreamReader(request.BodyStream))
                {
                    var body = await streamReader.ReadToEndAsync().ConfigureAwait(false);

                    if (_traceWriter != null &&
                        _traceWriter.IsEnabled)
                    {
                        await _traceWriter.TraceAsync(body, DataOperation.Receive).ConfigureAwait(false);
                    }

                    document = _serializer.Deserialize(body, mediaType);
                }
            }

            return(document);
        }