public virtual Task <Message> ExecuteOperation(OperationContext context)
        {
            int requestId = Interlocked.Increment(ref _requestId);

            context.Message.AttachHeader(new OperationHeader(requestId, OperationType.Request));

            var continuation = new PendingOperation(requestId);

            if (!PendingOperationsByRequestId.TryAdd(requestId, continuation))
            {
                throw new Exception("This could happen only if requestId is duplicated");
            }

            var expiration = Task.Delay(TimeSpan.FromSeconds(ExpirationTimeout), continuation.Expiration.Token);

            expiration.ContinueWith((_) =>
            {
                PendingOperation dummy;
                if (PendingOperationsByRequestId.TryRemove(continuation.RequestId, out dummy))
                {
                    continuation.TCS.SetException(new Exception(string.Format("ExecuteOperation<{0}, {1}> has Expired after {2} sec", requestId, context.Message, ExpirationTimeout)));
                }
            });

            Log.Debug("Sending " + context.Message);
            Channel.Send(context.Message);
            MessageFactory.Free(context.Message);

            return(continuation.TCS.Task);
        }