public async Task Request(Message message, TimeSpan timeout, Func <Message, Task <bool> > replyHandler, bool deadletterOnHandlerFailure = false)
        {
            var sasToken      = GenerateSasToken($"{_settings[ASBSettings.ServicebusFqdnEndpoint]}{ASBSettings.SessionQueueName}/", _receiveKeyName, _receiveKey, timeout);
            var _replyBuilder = new ServiceBusConnectionStringBuilder(_settings[ASBSettings.ServicebusFqdnEndpoint], ASBSettings.SessionQueueName, sasToken);
            var sessionId     = Guid.NewGuid().ToString("D");

            message.ReplyToSessionId = sessionId;
            message.ReplyTo          = _replyBuilder.GetEntityConnectionString();
            message.TimeToLive       = timeout;

            var session = await _receiveClient.AcceptMessageSessionAsync(sessionId);

            await _sendClient.SendAsync(message);

            var reply = await session.ReceiveAsync(timeout);

            if (reply != null)
            {
                if (await replyHandler(reply))
                {
                    await session.CompleteAsync(reply.SystemProperties.LockToken);
                }
                else if (deadletterOnHandlerFailure)
                {
                    await session.DeadLetterAsync(reply.SystemProperties.LockToken);
                }
            }
            else
            {
                throw new Exception("No reply received within the timeout period");
            }
        }