Extension objects are used to consume external .NET libraries from within XSLT maps. This is often required to perform database lookups or complex functions during a transformation. Read more about extension objects in this excellent blog.
We are facing two big challenges:
- We must execute the existing XSLT’s with extension objects in Logic App maps
- On premises Oracle and SQL databases must be accessed from within these maps
It’s clear that we should extend Logic Apps with non-standard functionality. This can be done by leveraging Azure Functions or Azure API Apps. Both allow custom coding, integrate seamlessly with Logic Apps and offer the following hybrid network options (when using App Service Plans):
- Hybrid Connections: most applicable for light weight integrations and development / demo purposes
- VNET Integration: if you want to access a number of on premise resources through your Site-to-Site VPN
- App Service Environment: if you want to access a high number of on premise resources via ExpressRoute
As the pricing model is quite identical, because we must use an App Service Plan, the choice for Azure API Apps was made. The main reason was the already existing WebAPI knowledge within the organization.
A Site-to-Site VPN is used to connect to the on-premise SQL and Oracle databases. By using a standard App Service Plan, we can enable VNET integration on the custom Transform API App. Behind the scenes, this creates a Point-to-Site VPN between the API App and the VNET, as described here. The Transform API App can be consumed easily from the Logic App, while being secured with Active Directory authentication.
The following steps were needed to build the solution. More details can be found in the referenced documentation.
- Create a VNET in Azure. (link)
- Setup a Site-to-Site VPN between the VNET and your on-premises network. (link)
- Develop an API App that executes XSLT’s with corresponding extension objects. (link)
- Foresee Swagger documentation for the API App. (link)
- Deploy the API App. Expose the Swagger metadata and configure CORS policy. (link)
- Configure VNET Integration to add the API App to the VNET. (link)
- Add Active Directory authentication to the API App. (link)
- Consume the API App from within Logic Apps.
The source code of the Transform API can be found here. It leverages Azure Blob Storage, to retrieve the required files. The Transform API must be configured with the required app settings, that define the blob storage connection string and the containers where the artefacts will be uploaded.
The Transform API offers one Transform operation, that requires 3 parameters:
- InputXml: the byte that needs to be transformed
- MapName: the blob name of the XSLT map to be executed
- ExtensionObjectName: the blob name of the extension object to be used
You can run this sample to test the Transform API with custom extension objects.
This is a sample input that can be provided as input for the Transform action.
This XSLT must be uploaded to the right blob storage container and will be executed during the Transform action.
Extension Object XML
This extension object must be uploaded to the right blob storage container and will be used to load the required assemblies.
Create an assembly named, TVH.Sample.dll, that contains the class Common.cs. This class contains a simple method to generate a GUID. Upload this assembly to the right blob storage container, so it can be loaded at runtime.
Deploy the Transform API, using the instructions on GitHub. You can easily test it using the Request / Response actions:
As a response, you should get the following output XML, that contains the generated GUID.
Important remark: Do not forget to add security to your Transform API (Step 7), as is it accessible on public internet, by default!
Thanks to the Logic Apps extensibility through API Apps and their VNET integration capabilities, we were able to build this solution in a very short time span. The solution offers an easy way to migrate BizTalk maps as-is towards Logic Apps, which is a big time saver! Access to resources that remain on premises is also a big plus nowadays, as many organizations have a hybrid application landscape.
Hope to see this functionality out-of-the-box in the future, as part of the Integration Account!
Thanks for reading. Sharing is caring!