Ejemplo n.º 1
0
        private async Task <MemoryStream> SendRequestImpl <TRequest>(TRequest request, TimeSpan?timeout)
            where TRequest : IRequest
        {
            if (_disposed)
            {
                throw new ObjectDisposedException(nameof(LogicalConnection));
            }


            var requestId    = _requestIdCounter.GetRequestId();
            var responseTask = _responseReader.GetResponseTask(requestId);

            var stream = CreateAndSerializeHeader(request, requestId);

            MsgPackSerializer.Serialize(request, stream, _msgPackContext);
            var totalLength  = stream.Position - Constants.PacketSizeBufferSize;
            var packetLength = new PacketSize((uint)(totalLength));

            AddPacketSize(stream, packetLength);

            ArraySegment <byte> buffer;

            if (!stream.TryGetBuffer(out buffer))
            {
                throw new InvalidOperationException("broken buffer");
            }

            //keep API for the sake of backward comp.
            _requestWriter.Write(
                // merged header and body
                buffer);

            try
            {
                if (timeout.HasValue)
                {
                    var cts = new CancellationTokenSource(timeout.Value);
                    responseTask = responseTask.WithCancellation(cts.Token);
                }

                var responseStream = await responseTask.ConfigureAwait(false);

                _logWriter?.WriteLine($"Response with requestId {requestId} is recieved, length: {responseStream.Length}.");

                return(responseStream);
            }
            catch (ArgumentException)
            {
                _logWriter?.WriteLine($"Response with requestId {requestId} failed, content:\n{buffer.ToReadableString()} ");
                throw;
            }
            catch (TimeoutException)
            {
                PingsFailedByTimeoutCount++;
                throw;
            }
        }
        private async Task <MemoryStream> SendRequestImpl <TRequest>(TRequest request, TimeSpan?timeout)
            where TRequest : IRequest
        {
            if (_disposed)
            {
                throw new ObjectDisposedException(nameof(LogicalConnection));
            }

            var bodyBuffer = MsgPackSerializer.Serialize(request, _msgPackContext);

            var requestId    = _requestIdCounter.GetRequestId();
            var responseTask = _responseReader.GetResponseTask(requestId);

            var headerBuffer = CreateAndSerializeHeader(request, requestId, bodyBuffer);

            _requestWriter.Write(
                headerBuffer,
                new ArraySegment <byte>(bodyBuffer, 0, bodyBuffer.Length));

            try
            {
                if (timeout.HasValue)
                {
                    var cts = new CancellationTokenSource(timeout.Value);
                    responseTask = responseTask.WithCancellation(cts.Token);
                }

                var responseStream = await responseTask.ConfigureAwait(false);

                _logWriter?.WriteLine($"Response with requestId {requestId} is recieved, length: {responseStream.Length}.");

                return(responseStream);
            }
            catch (ArgumentException)
            {
                _logWriter?.WriteLine($"Response with requestId {requestId} failed, header:\n{headerBuffer.ToReadableString()} \n body: \n{bodyBuffer.ToReadableString()}");
                throw;
            }
            catch (TimeoutException)
            {
                PingsFailedByTimeoutCount++;
                throw;
            }
        }