示例#1
0
        /// <exception cref="System.ObjectDisposedException">Methods were called after the stream was closed. </exception>
        /// <exception cref="System.NotSupportedException">The stream does not support writing, or the stream is already closed. </exception>
        /// <exception cref="System.InvalidOperationException">The stream is currently in use by a previous write operation. </exception>
        /// <exception cref="IOException">An I/O error occurs. </exception>
        public static async Task WriteAsync(this Stream stream, ClientMessageBase message,
                                            CancellationToken cancellationToken)
        {
            message.RequestId = GetNextRequestId();

            byte[] messageBytes;

            using (var ms = new MemoryStream())
            {
                using (var packer = Packer.Create(ms))
                {
                    message.PackToMessage(packer, null);
                    messageBytes = ms.ToArray();
                }
            }

            // ReSharper disable once ExceptionNotDocumented
            var messageLength = messageBytes.Length;

            stream.WriteByte(0xce);
            stream.WriteByte((byte)(messageLength >> 24));
            stream.WriteByte((byte)(messageLength >> 16));
            stream.WriteByte((byte)(messageLength >> 8));
            stream.WriteByte((byte)messageLength);
            // ReSharper disable once ExceptionNotDocumented
            await stream.WriteAsync(messageBytes, 0, messageBytes.Length, cancellationToken);
        }
        /// <summary>Send request to Tarantool server and get response.</summary>
        /// <param name="clientMessage">The client message.</param>
        /// <param name="cancellationToken">The cancellation token.</param>
        /// <returns>The <see cref="Task" /> with response.</returns>
        public async Task <MessagePackObject> RequestAsync(
            ClientMessageBase clientMessage,
            CancellationToken cancellationToken)
        {
            Task <MessagePackObject> resultTask;

            using (var connection = await AcquireConnectionAsync(cancellationToken).ConfigureAwait(false))
            {
                resultTask = await connection.RequestAsync(clientMessage, cancellationToken).ConfigureAwait(false);
            }

            return(await resultTask.ConfigureAwait(false));
        }
示例#3
0
        /// <summary>Send request to Tarantool server.</summary>
        /// <param name="clientMessage">The client message.</param>
        /// <param name="cancellationToken">The cancellation token.</param>
        /// <returns>The <see cref="Task" /> for awaiting the result.</returns>
        /// <exception cref="System.IO.IOException">An I/O error occurs. </exception>
        /// <exception cref="ObjectDisposedException"></exception>
        /// <exception cref="InvalidOperationException">The stream is currently in use by a previous write operation. </exception>
        /// <exception cref="TarantoolResponseException"></exception>
        public async Task <Task <MessagePackObject> > RequestAsync(
            ClientMessageBase clientMessage,
            CancellationToken cancellationToken)
        {
            CheckDisposed();
            await _stream.WriteAsync(clientMessage, cancellationToken).ConfigureAwait(false);

            return(WhenResponseAsync(clientMessage.RequestId)
                   .ContinueWith(
                       t =>
            {
                var response = t.Result;
                if (response.IsError)
                {
                    throw new TarantoolResponseException(response.ErrorMessage, response.Code);
                }
                return response.Body;
            },
                       cancellationToken));
        }
 /// <summary>Performs a general request.</summary>
 /// <param name="clientMessage">The request.</param>
 /// <param name="cancellationToken">The cancellation token.</param>
 /// <returns>The <see cref="Task" /> with MessagePackObject as result.</returns>
 public async Task <MessagePackObject> RequestAsync(
     ClientMessageBase clientMessage,
     CancellationToken cancellationToken)
 {
     return(await _connectionPool.RequestAsync(clientMessage, cancellationToken).ConfigureAwait(false));
 }
示例#5
0
 /// <summary>
 /// Translates request to linked acquired connection.
 /// </summary>
 /// <param name="clientMessage">The client message.</param>
 /// <param name="cancellationToken">The cancellation token.</param>
 /// <returns>The <see cref="Task"/> for awaiting the result.</returns>
 public Task <Task <MessagePackObject> > RequestAsync(ClientMessageBase clientMessage, CancellationToken cancellationToken)
 {
     return(_connection.RequestAsync(clientMessage, cancellationToken));
 }