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"); } }