What is an Integration Service Environment?

An Integration Service Environment is a fully isolated and dedicated environment for all enterprise-scale integration needs. When you create a new Integration Service Environment, it is injected into your Azure virtual network, which allows you to deploy Logic Apps as a service on your VNET.

  • Direct, secure access to your virtual network resources. Enables Logic Apps to have secure, direct access to private resources, such as virtual machines, servers, and other services in your virtual network including Azure services with service endpoints and on-premises resources via an Express Route or site to site VPN.
  • Consistent, highly reliable performance. Eliminates the noisy neighbor issue, removing fear of intermittent slowdowns that can impact business critical processes with a dedicated runtime where only your Logic Apps execute in.
  • Isolated, private storage. Sensitive data subject to regulation is kept private and secure, opening new integration opportunities.
  • Predicable pricing. Provides a fixed monthly cost for Logic Apps. Each Integration Service Environment includes the free usage of 1 Standard Integration Account and 1 Enterprise connector. If your Logic Apps action execution count exceeds 50 million action executions per month, the Integration Service Environment could provide better value.

The Microsoft documentation covers the technical aspects of various components. But, for someone who is not into Networking, it might be bit vague to setup those components and hook them up. I have been implementing Azure Logic Apps for the past 2.5 years but I had no requirements to deploy Logic Apps to ISE. I did had to interface with an on-premise file share. 

Ok, first things first.


Create a Logic App in a ISE. The Logic app should pick up an order xml file from a file share and send the data to an  RestFul API to get the order status. 

The fileshare and the RestFul service are available in a VM deployed within a virtual network.

 Below are the components that we will build in this exercise

  • Resource Group
  • Azure Virtual Network
  • Subnet * 5
  • Virtual Machine
  • Update Network Security Group (NSG)
  • Integration Service Environment (ISE)
  • Restful App
  • Custom Connector
  • Logic App

Create Resource Group

As we all know, a resource group acts as a container for all the other azure components. So, for the sake of simplicity, let’s create one resource group “LogicAppsISE” and create all subsequent components under this RG. At the end of the exercise, it will be easy to delete just the Resource group. 

Create Azure Virtual Network

Go to Azure Portal and click “Create a resource”

Create the Virtual Network with the following values from the screenshot

Logic Apps ISE requires 4 Empty subnets.  However, we will be provisioning an Azure VM on a subnet within the virtual network. So, in total we need to create 5 subnets.

Below is the details from the Microsoft website.

Your virtual network needs to have four empty subnets for creating and deploying resources in your ISE. You can create these subnets in advance, or you can wait until you create your ISE where you can create subnets at the same time. Learn more about subnet requirements.

Create Subnets

Delete the existing “default” subnet which was created and create 5 subnets based on the following picture

Once all the Subnets are created, you should have something like this.

Create Virtual Machine

I believe creating a virtual machine is by far the easiest step. All you need to provide is a name for the VM and username/password.

The VirtualNetwork and Subnet that we created earlier will be automatically selected for you. 

Update Network Security Group (NSG)

The Logic app will have to communicate with the RESTful api on port 80. Although from a Logic app ISE point of view, no additional configuration is not required, it is required to amend the NSG to add a inbound rule to allow port 80.

As part of the VM creation, a NSG would have already been created. We just have to add an inbound rule to allow port 80.

Create Integration Service Environment (ISE)

Creating an Integration Service Environment is quite straight forward. Head to Azure portal and choose the link to Create a Integration Service Environment. You can find this under the Integration area. As mentioned previously, a ISE requires 4 empty subnets. I think you will remember that we created 5 subnets under the virtual network and allocated one for the Virtual machine. So we could allocate the remaining 4 subnets to the ISE. I hope the below screenshots should help. 

Create RESTful App

Let’s re-iterate our requirements.

The Logic App should pick up a xml file from an on-premise file share and send the data to an on-premise RESTful API. Now, Logic App ISE, as of now, doesn’t provide a out of the box connector that could talk to the on premise file share. So, one option is to use the on-premise gateway. But there is one other option, which is bit long winded.

The Approach
  • Create a RESTful API that can read the  file share on the VM
  • Create a cutom connector to access the above api

I hope you get the gist of it. Let’s get cracking with the API

I created a simple ASP.Net web api with two controllers. FileController & OrderController

Below is the FileController source code

public class FileController : ApiController
        public IHttpActionResult GetFileContents()
            System.Net.Http.Headers.HttpRequestHeaders headers = this.Request.Headers;
            string path = string.Empty;
            if (headers.Contains("Path"))
                path = headers.GetValues("Path").First();
                throw new ApplicationException("Path Header cannot be empty");

            var content = System.IO.File.ReadAllText(path);

            DemoFile fileContent = new DemoFile
                FileContent = content

            return Content(HttpStatusCode.OK, fileContent);


Below is the OrderController source code

public class OrderController : ApiController
        public IHttpActionResult GetOrderStatus()
            System.Net.Http.Headers.HttpRequestHeaders headers = this.Request.Headers;
            string orderId = string.Empty;
            if (headers.Contains("OrderId"))
                orderId = headers.GetValues("OrderId").First();
                throw new ApplicationException("OrderId Header cannot be empty");

            Order order = new Order()
                OrderId = orderId,
                OrderStatus = "Approved"

            return Content(HttpStatusCode.OK, order);

You get download the source code from the github repo. https://github.com/shankarmaha/DemoWebAPI

Now that we have the web api, it is time to deploy the web api on the Azure virtual machine. I have added a webdeploy package to the releases section.

Once you have downloaded the files, you can use the command DemoWebApi.deploy.cmd /Y to deploy the web api to your local IIS

I am not going to detail about how to setup IIS and enable other roles/features on the Azure VM. I think there is plenty of articles on how to setup that. 

Create Custom Connector

We are going to create a custom connector that will expose the RESTful API that we developed in the last section. However, to do the setup, we need a OpenAPI document that represents the RESTful api. I have added swashbuckle package to the api, which provides the corresponding documentation. I have added the json file to the releases section. See here. Now, let’s head on to create the connector.

In the create Logic apps custom connector, give it a name.

In the general section, choose the API endpoint as REST. Choose OpenAPI file option for Import mode. Browse the swagger json file that I had mentioned before and click Import.

Scroll down to the General information. Upload a connector icon if you fancy it. You could provide a background color for your icon as well or you could just leave it empty. Provide a description for your connector. Choose the schema as HTTP, as we haven’t secured the web api. The Host here denotes the VM where the service is deployed. You can get the ip address from the VM overview blade. You could copy the public ip address or the private ip address. Both should work, as we have opened up the port for the subnets to communicate between each other.

Please proceed to the security section. As we haven’t added any authentication, we can proceed to the definition section.

As you know, we have two actions i.e. GetFileContents and GetOrderStatus. We have to specify summary, description and the Operation ID for each of the actions.

After this, we need to click the “Update connector” at the top of the screen. If everything goes okay, your connector is now ready to use.

Create Logic App

This is the last piece in the puzzle. I created a logic app which is triggered by a Request trigger. We now need to add our custom connector as the next action. As the name suggest, the custom connector actions can be found in the custom section

When you click the custom connector and choose the “Method to receive the file from on-premise file share”, the logic app engine will create a connection and it could then be used for subsequent actions. Please see below screenshot for the logic app design

This concludes this demo. Please give me a shout if you have any questions regarding this demo.

Visits: 3410

0 0 vote
Article Rating
Notify of
Inline Feedbacks
View all comments
Would love your thoughts, please comment.x