D365: Post custom message to Session Enabled Service Bus Queue C#

In one of my previous posts, https://ajitpatra.com/2019/12/09/d365-post-custom-message-to-azure-service-bus-queue-c/, we had gone through how to post custom message to a service bus queue. In this post, we’ll see how we can post the same message to a session enabled queue.

We have to make few lines of code changes in PostMessageToServiceBusQueue method of this post as shown below:

public static void PostMessageToServiceBusQueue(dxc_rate rate)
 TimeSpan ts = new TimeSpan(0, 0, 90);
var ServiceBusNamespaceURL = "sb://demoazure.servicebus.windows.net";
var ServiceBusQueueURL = "https://demoazure.servicebus.windows.net/demoqueue/messages";
var SASKeyName = "IntegrationKey";
var SASKeyValue = "qkWTne2zdLQvJv6qp2+G1eqNau7XGfZZlZAEQTV9Y+A=";
                string sasToken = Common.GetSASToken(ServiceBusNamespaceURL, SASKeyName, SASKeyValue, ts);
                RateObject rateObject = new RateObject
                    RateID = rate.dxc_rateId.ToString(),
                    EndDate = rate.dxc_EndDate == null ? string.Empty : rate.dxc_EndDate.ToString(),
                    StartDate = rate.dxc_StartDate == null ? string.Empty : rate.dxc_StartDate.ToString(),
                    RateAmount = rate.dxc_Rate == null ? string.Empty : rate.dxc_Rate.Value.ToString(),
                    RatePercentage = rate.dxc_RatePercentage == null ? string.Empty : rate.dxc_RatePercentage.ToString(),
                    RateModel = rate.dxc_ratemodel == null ? string.Empty : rate.dxc_ratemodel.Value.ToString(),
                    RevenueCodeID = rate.dxc_RevenueCodeId == null ? string.Empty : rate.dxc_RevenueCodeId.Id.ToString()
                var json = Common.SerializeToJsonString(rateObject);
                HttpClient client = new HttpClient();
                client.DefaultRequestHeaders.Add("Authorization", sasToken);
 var brokerProperties = new BrokerProperties { SessionId = Guid.NewGuid().ToString() };
                        client.DefaultRequestHeaders.Add("BrokerProperties", Common.SerializeToJsonString(brokerProperties));
                var Content = new StringContent(json, Encoding.UTF8, "application/json");
                var response = client.PostAsync(ServiceBusQueueURL, Content);

We are using a custom class named BrokerProperties as shown below:

    public class BrokerProperties
        public string SessionId { get; set; }

Now, to send the message to a session enabled queue, we need to make sure that the queue is session enabled while creating it.

After posting the message, in Service Bus Explorer, we can see the details of the message with Session Id as shown below:

In our case, we have a Service Bus triggered Azure Function in which we read the message and perform some action. So, in that Azure Function, we need to add IsSessionsEnabled = true to ServiceBusTrigger attribute as shown below:

public static async Task Run([ServiceBusTrigger("%CalculateCSRQueue%", Connection = "AzureWebJobsServiceBus", IsSessionsEnabled = true)] Message message,
            MessageReceiver messageReceiver,
            string lockToken,
            [DurableClient]IDurableOrchestrationClient starter, ILogger log)

Service Bus triggered Azure Functions without IsSessionsEnabled attribute will not be able to read messages from session enabled service bus queues.

More details on how to use Service Bus triggered Azure Durable Function with D365 CE is here: https://ajitpatra.com/2020/01/15/using-service-bus-triggered-azure-durable-function-with-d365-ce/.

Hope it helps !!


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.