Task ISendTransport.Send <T>(T message, IPipe <SendContext <T> > pipe, CancellationToken cancellationToken)
        {
            IPipe <EventDataSendEndpointContext> clientPipe = Pipe.ExecuteAsync <EventDataSendEndpointContext>(async clientContext =>
            {
                var context = new EventDataSendContext <T>(message, cancellationToken);

                try
                {
                    await pipe.Send(context).ConfigureAwait(false);

                    await _observers.PreSend(context).ConfigureAwait(false);

                    using (var messageBodyStream = context.GetBodyStream())
                    {
                        var eventData = new EventData(messageBodyStream);

                        KeyValuePair <string, object>[] headers = context.Headers.GetAll()
                                                                  .Where(x => x.Value != null && (x.Value is string || x.Value.GetType().IsValueType))
                                                                  .ToArray();

                        foreach (KeyValuePair <string, object> header in headers)
                        {
                            if (eventData.Properties.ContainsKey(header.Key))
                            {
                                continue;
                            }

                            eventData.Properties.Add(header.Key, header.Value);
                        }

                        if (context.PartitionKey != null)
                        {
                            eventData.PartitionKey = context.PartitionKey;
                        }

                        await clientContext.Send(eventData).ConfigureAwait(false);

                        context.LogSent();

                        await _observers.PostSend(context).ConfigureAwait(false);
                    }
                }
                catch (Exception ex)
                {
                    await _observers.SendFault(context, ex).ConfigureAwait(false);

                    throw;
                }
            });

            return(_source.Send(clientPipe, cancellationToken));
        }
        Task ISendTransport.Send <T>(T message, IPipe <SendContext <T> > pipe, CancellationToken cancellationToken)
        {
            IPipe <EventDataSendEndpointContext> clientPipe = Pipe.ExecuteAsync <EventDataSendEndpointContext>(async clientContext =>
            {
                var context = new EventDataSendContext <T>(message, cancellationToken);

                try
                {
                    await pipe.Send(context).ConfigureAwait(false);

                    await _observers.PreSend(context).ConfigureAwait(false);

                    using (var eventData = new EventData(context.Body))
                    {
                        eventData.Properties.SetTextHeaders(context.Headers, (_, text) => text);

                        // if (context.PartitionKey != null)
                        //     eventData.PartitionKey = context.PartitionKey;

                        await clientContext.Send(eventData).ConfigureAwait(false);

                        context.LogSent();

                        await _observers.PostSend(context).ConfigureAwait(false);
                    }
                }
                catch (Exception ex)
                {
                    await _observers.SendFault(context, ex).ConfigureAwait(false);

                    throw;
                }
            });

            return(_source.Send(clientPipe, cancellationToken));
        }