Today in this blog, I will explain how we can communicate with the Microsoft dynamics 365 from an external website using Azure Service Bus & Logic App.
Using Logic App we can create, update, return list of records etc from the CRM. Below is an example of how we can create the record in the CRM on trigger from an external resource such as website, mobile app etc.
For this, I have created a web API(c#) and added a class (Model), with the required parameters:-
Model class
public class RecordDetails { public string FirstName { get; set; } public string LastName { get; set; } public string Address { get; set; } }
And, below is the controller class performing the logic that connects to the Azure Logic App using Service Bus.
Note:- You will require below namespaces in the controller. You can download it from NuGet gallary:-
using System; using System.Web.Http; using Microsoft.ServiceBus.Messaging; using Newtonsoft.Json; using System.Text; using System.IO; using System.Configuration; using Microsoft.Azure; using Microsoft.ServiceBus;
Controller Class
[RoutePrefix("api")] public class CreateRecordController : ApiController { [HttpPost] [Route("CreateRecordDetails")] public IHttpActionResult CreateRecordDetails([FromBody] RecordDetails parameters) { try { #region Check the state of the Model //If the Model State is invalid, then, return Error response if (!ModelState.IsValid) { return BadRequest(ModelState); } #endregion #region Send parameters send to the controller to Azure servicebus //Create the MessageSender object MessageSender sender = CreateSender(); if (sender != null) { //Serialize Object string recordDetailsAttributeValues = JsonConvert.SerializeObject(parameters, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }); //Send Message to the Azure ServiceBus byte[] bytes = Encoding.UTF8.GetBytes(recordDetailsAttributeValues); MemoryStream stream = new MemoryStream(bytes, writable: false); sender.Send(new BrokeredMessage(stream)); result = Ok("The data has been submitted successfully."); } else { result = BadRequest("Could not connect the Azure Service Bus."); } #endregion } catch (Exception ex) { throw new Exception(ex.Message); } return result; } #region CreateSender /// <summary> /// Create the Message sender object to access Service Bus of Azure portal /// </summary> /// <returns>MessageSender Object</returns> private static MessageSender CreateSender() { #region Variable declarations string keyName = string.Empty; string accessKey = string.Empty; string baseAddress = string.Empty; string topicName = string.Empty; MessageSender sender = null; #endregion try { //Get Service Bus details from local app settings keyName = ConfigurationManager.AppSettings["SvcBusSharedAccessKey"]; accessKey = ConfigurationManager.AppSettings["SvcBusAccessKey"]; baseAddress = ConfigurationManager.AppSettings["SvcBusBaseAddress"]; topicName = ConfigurationManager.AppSettings["SvcBusTopicName"]; //Create the Message sender object TokenProvider tokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(keyName, accessKey); MessagingFactory messagingFactory = MessagingFactory.Create(baseAddress, tokenProvider); sender = messagingFactory.CreateMessageSender(topicName); } catch (Exception ex) { throw new Exception(ex.Message); } return sender; } #endregion }
In the above web API, we are sending all the data received from the external resource / website to the Azure Logic App. The External website will call this web API and pass the fields as parameter with values to create in CRM.
You need to set the Service Bus details in Web.config file as follows:-
<configuration> <appSettings> <add key="ClientValidationEnabled" value="true" /> <add key="SvcBusSharedAccessKey" value="SharedAccessKeyName from the Primary Connection String of the Service Bus goes here" /> <add key="SvcBusAccessKey" value="SharedAccessKey from the Primary Connection String of the Service Bus goes here" /> <add key="SvcBusBaseAddress" value="Endpoint from the Primary Connection String of the Service Bus goes here" /> <add key="SvcBusTopicName" value="Topic name goes here" /> </appSettings> </configuration>
To get the Service Bus details, navigate as follows in Azure portal:-
Home → Resource groups → Click on your resource group link → Click on your Service Bus namespace link → Go to the (SETTINGS→ Shared Access Policies) → Click on the Policy → Copy the Primary Connection String
From the ‘Primary Connection String’ of the Service Bus, you will get the SvcBusSharedAccessKey, SvcBusAccessKey & SvcBusBaseAddress.
You can get the Topic name from Service Bus namespace by navigating from Home → Resource groups → Click on your resource group link → Click on your Service Bus namespace link → Go to the (ENTITIES→ Topics) → Copy the name
Now, let us see how the Logic App will consume the data that we send and how the record will be created in the CRM.
The flow of the Logic App will be as follows:-
Here, the first step is to create the Service Bus, that receives the data that we send from the web API.
Please refer the below link to know, how to create Service Bus in Logic App:-
https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-create-namespace-portal
The second step is to parse the JSON message received from the Service Bus to user friendly tokens for Logic App consumption.
The Parse JSON Component of the Logic App is having two parts:-
1. Content
This will have the function as below to convert the message received from the Service Bus to user friendly tokens:
substring(base64ToString(triggerBody()?['ContentData']), indexof(base64ToString(triggerBody()?['ContentData']), '{'), sub(lastindexof(base64ToString(triggerBody()?['ContentData']), '}'),indexof(base64ToString(triggerBody()?['ContentData']), '{')))
2. Schema
Here, we need to declare all the fields send from the controller and send it as an object:-
{ "properties": { "FirstName": { "type": "string" }, "LastName": { "type": "string" }, "Address": { "type": "string" } }, "type": "object" }
After the JSON object is parsed, the next step is to create the record in dynamic CRM.
Please refer the below link to know how to create record in CRM from Logic App:-
https://docs.microsoft.com/en-us/azure/connectors/connectors-create-api-crmonline
Now, we need to just call our web API from the external resource such as website, mobile app etc. And the record will then be created in the CRM.
Please refer the below link to know in detail how to call the web API that we have created above, from an external resource to create record in CRM using Azure Service Bus & Logic App.
I hope this helps you!!
Happy CRMing.
Insert data into Many-to-Many relationship in Dynamics CRM very easily & quickly, using the Drag and drop listbox.
http://www.inkeysolutions.com/what-we-do/dynamicscrmaddons/drag-and-drop-listbox
Create a personal / system view in Dynamics CRM with all the fields on the form/s which you select for a particular entity using the View Creator.
http://www.inkeysolutions.com/what-we-do/dynamicscrmaddons/view-creator
© All Rights Reserved. Inkey IT Solutions Pvt. Ltd. 2024
[…] Integrate external web resource with Microsoft Dynamics 365 using Azure Service Bus & Logic App […]