This blog post is a collaboration between Praveen Srivastava (Principal Software Engineering Manager) and Kent Weare (Principal Product Manager) from the Azure Logic Apps team.
Update (03/03/2023): This post has been updated to reflect two new capabilities that are included in .NET Framework and XSLT support. These two new capabilities include support for Extension Objects and a native Azure Portal Assembly upload capability.
Update (7/13/2023): Enabling the Muilti Language Worker feature is no longer required in Application Settings as it is enabled directly in our runtime as of function host 4.20 or above. As a result, the reference has been removed from this post.
The Azure Logic Apps team is pleased to announce the release of .NET Framework assembly support for XSLT maps in Logic Apps (Standard). This capability adds more extensibility options to Azure Logic Apps (Standard) and allows organizations to extract more value out of existing .NET Framework investments.
These investments will aid customers in moving both BizTalk Server and Azure Logic (Consumption)/(ISE) workloads to Azure Logic Apps (Standard).
Managing Custom Artifacts
Previously, customers were able to upload XSLT maps to an Integration Account where a consumption-based logic app could execute that map via an out of box action. We are now bringing similar capabilities to Azure Logic Apps (Standard), but without a dependency on the Integration Account.
Within Azure Logic Apps (Standard), developers can upload maps and schemas to their respective folder within the Artifacts folder of their project. Similarly, we will now support a folder where developers can place compiled assemblies that are called from XSLT maps.
The folder structure for uploading .NET Framework assemblies includes a path with the following folders \lib\custom\net472. The .NET Framework assemblies that you want to call should be placed within the net472 folder as highlighted below.
Understanding this folder structure is particularly important when using VS Code to build your Logic Apps solutions. However, when using the new Azure Portal upload capability, we will place your assemblies in the correct folder for you.
The XSLT + .NET Framework addresses a couple core scenarios including Azure Logic Apps Integration Service Environment (ISE) and BizTalk migrations.
Azure Logic Apps (ISE) Migration
Customers who currently use an ISE instance and subsequently an Integration Account to support calling data transformations can move these maps to Azure Logic Apps (Standard) without the need for an Integration Account. Other than moving the artifacts into the respective folders, there are no additional actions required.
Customers looking to move integration workloads from BizTalk Server to Azure Integration Services can take advantage of this capability and move their data transformations into the cloud without having to re-map nodes and elements.
To generate an XSLT file from a BizTalk map, located you map, right mouse click on it and then click on Validate Map. Once you have done so you will see a status message within your Output window that includes a link to your generated XSL file on your local hard drive. Ensure to rename this file to have a .xslt extension. You will also find a reference to your Extension Object XML file as well. We will need the contents of this file when configuring our XML Transform action.
Our scenario includes uploading an XSLT map and a .NET Framework assembly which is called from our XSLT map. To implement our scenario, we will complete the following steps in either the Azure Portal or VS Code:
Navigate to the Azure Portal and discover the Artifacts section listed in the left navigation pane. Click on Maps, followed by the Add button where you can select your .XSLT file.
With our XSLT file setup, we can now upload our custom assembly in the Azure Portal by taking advantage of the new Assembly upload capability. We can find this new experience by clicking on the Assemblies link in the left navigation. Subsequently, we can click on the Add link.
The Add Assembly panel will emerge on the right hand side of the screen where we can choose our Assembly Type. In our case, we want to select Custom Assembly (.NET Framework). We can then choose our assemblies by dragging them into this experience or by using the Browse for files.
Once our assembly has been uploaded, we will see it listed in the Assemblies table.
With our XSLT and .NET Framework assembly uploaded, we can now construct a workflow that will call our XSLT transform from the Transform XML action.
As part of configuring the Transform XML action, we do need to configure our Extension Object. Extension Objects are a concept that exist in BizTalk Server. The BizTalk runtime will use Extension Objects to load the correct assembly at runtime so that a BizTalk map can call the correct assembly. Recently, Microsoft has released a new capability that allows you to embed Extension Object content directly into your XML Transform action. This will subsequently allow developers to move their XSLT and .NET Framework solutions into Azure Logic Apps (Standard) without the need to modify the underlying XSLT.
The XML Extension Object property is an optional property that can be enabled by selecting it from the Add new parameter drop down.
With the property now enabled, we can copy the contents from the Extension Object file that BizTalk generated and place those contents within our Transform XML action.
When we call this workflow, we will see that our custom code has been executed.
We can also accomplish deployments through VS Code. Within your VS Code project, ensure you have the following setup:
Place your XSLT file into the Artifacts\Maps folder
Create the lib\custom\net472 folder structure at the same level as the Artifacts folder and include your .NET Framework assembly within this folder.
Select your XSLT map from the Name drop down.
Configure your Extension Object as described previously in this post.
With this configuration established, you can now deploy this project to Azure. Please ensure you have the configuration settings we established previously in this document.
If you would see an updated video version of this content, please check out the following YouTube video:
Frequently Asked Questions
Q. Do I need an Integration Account to use this feature?
A. No, an Integration Account is not required to execute maps that reference .NET Framework assemblies in Azure Logic Apps (Standard). The Integration Account continues to be a dependency for Azure Logic Apps Consumption and ISE SKUs.
Q. Does this feature cost additional money to use?
A. There are no additional charges, beyond the Workflow Service Plan that is required when provisioning Azure Logic Apps (Standard).
Q. Do I need to modify my XSLT files to include references to my .NET Framework assembly?
A. In an earlier version of our public preview, this was required, but this is no longer the case. We now support providing Extension Object support on the Transform XML action.
Q. What versions of .NET Framework can I call?
A. We are supporting up to .NET Framework 4.7.2. If you are using a later version, you can compile down to 4.7.2 and then include it in your Logic Apps project.