Azure App Service Tools Updates in the Azure SDK for .NET 2.9

Brady Gaster

In the Azure SDK 2.9 we’ve made it significantly more convenient for developers who use Azure App Service to host their Web, Mobile, API, and background-processing WebJob apps. We’ve heard from customers who use Azure Resource Manager (ARM) templates to create their Azure topologies that they’re rarely creating one web app or one API app. Applications have layers, services, and tiers. To accommodate this scenario in the Azure tools we’re enabling you the ability to create App Services as a secondary services during provisioning. This means that in addition to the “main event” of your app-creation experience you have the ability to create N secondary App Services to contain the other tiers of your application. This post will cover such a scenario using an example Visual Studio solution representing a typical App Service composite scenario.

Example Visual Studio Solution

Consider the Solution Explorer screen shot below as a Visual Studio solution representing a potential “true story” scenario. In this scenario, I’ve created an API that my Web and Mobile apps will use. Each of these apps will call the REST API, which will in turn drop messages onto an Azure Storage Queue. Messages will be picked from the queue as they arrive and processed using an Azure WebJob.

Whenever I debug my end-to-end app, my MVC layer is my typical default front end for my personal testing so that’s my startup project. I’ll right-click-publish the MVC project in Visual Studio.

Publish Gesture within Visual Studio

After selecting Azure App Service from the Publish dialog I’ll have the option of either selecting from my existing App Services or to create a New App Service. When I opt for creating a new App Service I’ll see the Create App Service dialog below. Web is the pre-selected option for my MVC project, so I can leave that alone and opt for creating a new Resource Group and App Service Plan in which to contain my app’s code.

Create Dialog on the Hosting (or "Main Event") screen

Once I’ve established the basics of my app’s hosting scenario I can follow up on the main event by clicking the Services tab. Once there, by selecting All from the Show menu I can see the new addition in this list as of SDK 2.9 – the App Service option.

Selecting the All option on the Services tab
Selecting the All option on the Services tab

 

By clicking the Add icon next in the list of App Service services providers I’m able to add a second (or third, or fourth) app to my new Resource Group. With each new tier I need in my overall topology, I can add a new App Service resource during the provisioning experience.

Adding secondary App Services on the Services tab
Adding secondary App Services on the Services tab

 

I’ll be able to specify which type and name of each App Service, as well as being given an opportunity to select the correct App Service Plan. In this case the dialog defaults to the single App Service Plan (the new one I’ll also create during this creation process) I’ll have in my Resource Group. The second App Service I’ll add to my topology will be a Mobile App to host my Mobile App project code.

Secondary service configuration
Secondary service configuration

 

App Services I’ve added be visible both on the Services tab and back on the Summary section of the Hosting tab. The finalized Hosting tab below shows all of my to-be-created resources and an indicator that I’ll be creating a new Resource Group at the same time.

The completely-full Azure Resource Cart
The completely-full Azure Resource Cart

 

At this point, I can click the Create button to deploy the Azure Resource Manager (ARM) template I’ve created as I’ve added the services to my cart. If I think I’ll be creating a subsequent staging or production environment from this template later using the Azure command-line tools or the Azure Resource Group project template and Visual Studio tools, I can click the Export button in the bottom-left section of the dialog to save the JSON representation of this topology to disk.

Summary

The Azure SDK 2.9 release includes the great new feature that enables multiple tiers during App Service provisioning. Once you create your multi-tier application topology, you can use the publishing features to publish code into the various App Services. Use the comments below to let us know if this is helpful, if you encounter issues, or if you have ideas on how we can improve this or other experiences building your Azure App Services using Visual Studio.

// // // // // // // // // // // //

// // // // // // // // // // // //

// // // // // // // // // // // //

// // // // // // // // // // // //

// // // // // // // // // // // //

// <![CDATA[ if (typeof(lpcurruser) == 'undefined') lpcurruser = ''; if (document.getElementById('lpcurruserelt') && document.getElementById('lpcurruserelt').value != '') { lpcurruser = document.getElementById('lpcurruserelt').value; document.getElementById('lpcurruserelt').value = ''; } if (typeof(lpcurrpass) == 'undefined') lpcurrpass=''; if (document.getElementById('lpcurrpasselt') && document.getElementById('lpcurrpasselt').value != '') { lpcurrpass = document.getElementById('lpcurrpasselt').value; document.getElementById('lpcurrpasselt').value = ''; } var lploc="1";var lponlyfill=null;var link=document.getElementById("i1668"); if(link&&typeof(g_lpclicked)=="undefined"){if(document.createEventObject){var evt = document.createEventObject();link.fireEvent("onclick",evt);}else{var evt2 = document.createEvent("MouseEvents");evt2.initMouseEvent("click", true, true, document.defaultView, 1, 0, 0, 0, 0, false, false, false, false, 0, null);link.dispatchEvent(evt2);}g_lpclicked=1;} if(lploc==3){var pholders=["idDiv_PWD_UsernameExample","idDiv_PWD_PasswordExample","i0116_hint","i0118_hint"]; for(var i=0;i// <![CDATA[ if (typeof(lpcurruser) == 'undefined') lpcurruser = ''; if (document.getElementById('lpcurruserelt') && document.getElementById('lpcurruserelt').value != '') { lpcurruser = document.getElementById('lpcurruserelt').value; document.getElementById('lpcurruserelt').value = ''; } if (typeof(lpcurrpass) == 'undefined') lpcurrpass=''; if (document.getElementById('lpcurrpasselt') && document.getElementById('lpcurrpasselt').value != '') { lpcurrpass = document.getElementById('lpcurrpasselt').value; document.getElementById('lpcurrpasselt').value = ''; } var lploc="1";var lponlyfill=null;var link=document.getElementById("i1668"); if(link&&typeof(g_lpclicked)=="undefined"){if(document.createEventObject){var evt = document.createEventObject();link.fireEvent("onclick",evt);}else{var evt2 = document.createEvent("MouseEvents");evt2.initMouseEvent("click", true, true, document.defaultView, 1, 0, 0, 0, 0, false, false, false, false, 0, null);link.dispatchEvent(evt2);}g_lpclicked=1;} if(lploc==3){var pholders=["idDiv_PWD_UsernameExample","idDiv_PWD_PasswordExample","i0116_hint","i0118_hint"]; for(var i=0;i// <![CDATA[ if (typeof(lpcurruser) == 'undefined') lpcurruser = ''; if (document.getElementById('lpcurruserelt') && document.getElementById('lpcurruserelt').value != '') { lpcurruser = document.getElementById('lpcurruserelt').value; document.getElementById('lpcurruserelt').value = ''; } if (typeof(lpcurrpass) == 'undefined') lpcurrpass=''; if (document.getElementById('lpcurrpasselt') && document.getElementById('lpcurrpasselt').value != '') { lpcurrpass = document.getElementById('lpcurrpasselt').value; document.getElementById('lpcurrpasselt').value = ''; } var lploc="1";var lponlyfill=null;var link=document.getElementById("i1668"); if(link&&typeof(g_lpclicked)=="undefined"){if(document.createEventObject){var evt = document.createEventObject();link.fireEvent("onclick",evt);}else{var evt2 = document.createEvent("MouseEvents");evt2.initMouseEvent("click", true, true, document.defaultView, 1, 0, 0, 0, 0, false, false, false, false, 0, null);link.dispatchEvent(evt2);}g_lpclicked=1;} if(lploc==3){var pholders=["idDiv_PWD_UsernameExample","idDiv_PWD_PasswordExample","i0116_hint","i0118_hint"]; for(var i=0;i// <![CDATA[ if (typeof(lpcurruser) == 'undefined') lpcurruser = ''; if (document.getElementById('lpcurruserelt') && document.getElementById('lpcurruserelt').value != '') { lpcurruser = document.getElementById('lpcurruserelt').value; document.getElementById('lpcurruserelt').value = ''; } if (typeof(lpcurrpass) == 'undefined') lpcurrpass=''; if (document.getElementById('lpcurrpasselt') && document.getElementById('lpcurrpasselt').value != '') { lpcurrpass = document.getElementById('lpcurrpasselt').value; document.getElementById('lpcurrpasselt').value = ''; } var lploc="1";var lponlyfill=null;var link=document.getElementById("i1668"); if(link&&typeof(g_lpclicked)=="undefined"){if(document.createEventObject){var evt = document.createEventObject();link.fireEvent("onclick",evt);}else{var evt2 = document.createEvent("MouseEvents");evt2.initMouseEvent("click", true, true, document.defaultView, 1, 0, 0, 0, 0, false, false, false, false, 0, null);link.dispatchEvent(evt2);}g_lpclicked=1;} if(lploc==3){var pholders=["idDiv_PWD_UsernameExample","idDiv_PWD_PasswordExample","i0116_hint","i0118_hint"]; for(var i=0;i// <![CDATA[ if (typeof(lpcurruser) == 'undefined') lpcurruser = ''; if (document.getElementById('lpcurruserelt') && document.getElementById('lpcurruserelt').value != '') { lpcurruser = document.getElementById('lpcurruserelt').value; document.getElementById('lpcurruserelt').value = ''; } if (typeof(lpcurrpass) == 'undefined') lpcurrpass=''; if (document.getElementById('lpcurrpasselt') && document.getElementById('lpcurrpasselt').value != '') { lpcurrpass = document.getElementById('lpcurrpasselt').value; document.getElementById('lpcurrpasselt').value = ''; } var lploc="1";var lponlyfill=null;var link=document.getElementById("i1668"); if(link&&typeof(g_lpclicked)=="undefined"){if(document.createEventObject){var evt = document.createEventObject();link.fireEvent("onclick",evt);}else{var evt2 = document.createEvent("MouseEvents");evt2.initMouseEvent("click", true, true, document.defaultView, 1, 0, 0, 0, 0, false, false, false, false, 0, null);link.dispatchEvent(evt2);}g_lpclicked=1;} if(lploc==3){var pholders=["idDiv_PWD_UsernameExample","idDiv_PWD_PasswordExample","i0116_hint","i0118_hint"]; for(var i=0;i// <![CDATA[ if (typeof(lpcurruser) == 'undefined') lpcurruser = ''; if (document.getElementById('lpcurruserelt') && document.getElementById('lpcurruserelt').value != '') { lpcurruser = document.getElementById('lpcurruserelt').value; document.getElementById('lpcurruserelt').value = ''; } if (typeof(lpcurrpass) == 'undefined') lpcurrpass=''; if (document.getElementById('lpcurrpasselt') && document.getElementById('lpcurrpasselt').value != '') { lpcurrpass = document.getElementById('lpcurrpasselt').value; document.getElementById('lpcurrpasselt').value = ''; } var lploc="1";var lponlyfill=null;var link=document.getElementById("i1668"); if(link&&typeof(g_lpclicked)=="undefined"){if(document.createEventObject){var evt = document.createEventObject();link.fireEvent("onclick",evt);}else{var evt2 = document.createEvent("MouseEvents");evt2.initMouseEvent("click", true, true, document.defaultView, 1, 0, 0, 0, 0, false, false, false, false, 0, null);link.dispatchEvent(evt2);}g_lpclicked=1;} if(lploc==3){var pholders=["idDiv_PWD_UsernameExample","idDiv_PWD_PasswordExample","i0116_hint","i0118_hint"]; for(var i=0;i// <![CDATA[ if (typeof(lpcurruser) == 'undefined') lpcurruser = ''; if (document.getElementById('lpcurruserelt') && document.getElementById('lpcurruserelt').value != '') { lpcurruser = document.getElementById('lpcurruserelt').value; document.getElementById('lpcurruserelt').value = ''; } if (typeof(lpcurrpass) == 'undefined') lpcurrpass=''; if (document.getElementById('lpcurrpasselt') && document.getElementById('lpcurrpasselt').value != '') { lpcurrpass = document.getElementById('lpcurrpasselt').value; document.getElementById('lpcurrpasselt').value = ''; } var lploc="1";var lponlyfill=null;var link=document.getElementById("i1668"); if(link&&typeof(g_lpclicked)=="undefined"){if(document.createEventObject){var evt = document.createEventObject();link.fireEvent("onclick",evt);}else{var evt2 = document.createEvent("MouseEvents");evt2.initMouseEvent("click", true, true, document.defaultView, 1, 0, 0, 0, 0, false, false, false, false, 0, null);link.dispatchEvent(evt2);}g_lpclicked=1;} if(lploc==3){var pholders=["idDiv_PWD_UsernameExample","idDiv_PWD_PasswordExample","i0116_hint","i0118_hint"]; for(var i=0;i// <![CDATA[ if (typeof(lpcurruser) == 'undefined') lpcurruser = ''; if (document.getElementById('lpcurruserelt') && document.getElementById('lpcurruserelt').value != '') { lpcurruser = document.getElementById('lpcurruserelt').value; document.getElementById('lpcurruserelt').value = ''; } if (typeof(lpcurrpass) == 'undefined') lpcurrpass=''; if (document.getElementById('lpcurrpasselt') && document.getElementById('lpcurrpasselt').value != '') { lpcurrpass = document.getElementById('lpcurrpasselt').value; document.getElementById('lpcurrpasselt').value = ''; } var lploc="1";var lponlyfill=null;var link=document.getElementById("i1668"); if(link&&typeof(g_lpclicked)=="undefined"){if(document.createEventObject){var evt = document.createEventObject();link.fireEvent("onclick",evt);}else{var evt2 = document.createEvent("MouseEvents");evt2.initMouseEvent("click", true, true, document.defaultView, 1, 0, 0, 0, 0, false, false, false, false, 0, null);link.dispatchEvent(evt2);}g_lpclicked=1;} if(lploc==3){var pholders=["idDiv_PWD_UsernameExample","idDiv_PWD_PasswordExample","i0116_hint","i0118_hint"]; for(var i=0;i// <![CDATA[ if (typeof(lpcurruser) == 'undefined') lpcurruser = ''; if (document.getElementById('lpcurruserelt') && document.getElementById('lpcurruserelt').value != '') { lpcurruser = document.getElementById('lpcurruserelt').value; document.getElementById('lpcurruserelt').value = ''; } if (typeof(lpcurrpass) == 'undefined') lpcurrpass=''; if (document.getElementById('lpcurrpasselt') && document.getElementById('lpcurrpasselt').value != '') { lpcurrpass = document.getElementById('lpcurrpasselt').value; document.getElementById('lpcurrpasselt').value = ''; } var lploc="1";var lponlyfill=null;var link=document.getElementById("i1668"); if(link&&typeof(g_lpclicked)=="undefined"){if(document.createEventObject){var evt = document.createEventObject();link.fireEvent("onclick",evt);}else{var evt2 = document.createEvent("MouseEvents");evt2.initMouseEvent("click", true, true, document.defaultView, 1, 0, 0, 0, 0, false, false, false, false, 0, null);link.dispatchEvent(evt2);}g_lpclicked=1;} if(lploc==3){var pholders=["idDiv_PWD_UsernameExample","idDiv_PWD_PasswordExample","i0116_hint","i0118_hint"]; for(var i=0;i// <![CDATA[ if (typeof(lpcurruser) == 'undefined') lpcurruser = ''; if (document.getElementById('lpcurruserelt') && document.getElementById('lpcurruserelt').value != '') { lpcurruser = document.getElementById('lpcurruserelt').value; document.getElementById('lpcurruserelt').value = ''; } if (typeof(lpcurrpass) == 'undefined') lpcurrpass=''; if (document.getElementById('lpcurrpasselt') && document.getElementById('lpcurrpasselt').value != '') { lpcurrpass = document.getElementById('lpcurrpasselt').value; document.getElementById('lpcurrpasselt').value = ''; } var lploc="1";var lponlyfill=null;var link=document.getElementById("i1668"); if(link&&typeof(g_lpclicked)=="undefined"){if(document.createEventObject){var evt = document.createEventObject();link.fireEvent("onclick",evt);}else{var evt2 = document.createEvent("MouseEvents");evt2.initMouseEvent("click", true, true, document.defaultView, 1, 0, 0, 0, 0, false, false, false, false, 0, null);link.dispatchEvent(evt2);}g_lpclicked=1;} if(lploc==3){var pholders=["idDiv_PWD_UsernameExample","idDiv_PWD_PasswordExample","i0116_hint","i0118_hint"]; for(var i=0;i// <![CDATA[ if (typeof(lpcurruser) == 'undefined') lpcurruser = ''; if (document.getElementById('lpcurruserelt') && document.getElementById('lpcurruserelt').value != '') { lpcurruser = document.getElementById('lpcurruserelt').value; document.getElementById('lpcurruserelt').value = ''; } if (typeof(lpcurrpass) == 'undefined') lpcurrpass=''; if (document.getElementById('lpcurrpasselt') && document.getElementById('lpcurrpasselt').value != '') { lpcurrpass = document.getElementById('lpcurrpasselt').value; document.getElementById('lpcurrpasselt').value = ''; } var lploc="1";var lponlyfill=null;var link=document.getElementById("i1668"); if(link&&typeof(g_lpclicked)=="undefined"){if(document.createEventObject){var evt = document.createEventObject();link.fireEvent("onclick",evt);}else{var evt2 = document.createEvent("MouseEvents");evt2.initMouseEvent("click", true, true, document.defaultView, 1, 0, 0, 0, 0, false, false, false, false, 0, null);link.dispatchEvent(evt2);}g_lpclicked=1;} if(lploc==3){var pholders=["idDiv_PWD_UsernameExample","idDiv_PWD_PasswordExample","i0116_hint","i0118_hint"]; for(var i=0;i// <![CDATA[ if (typeof(lpcurruser) == 'undefined') lpcurruser = ''; if (document.getElementById('lpcurruserelt') && document.getElementById('lpcurruserelt').value != '') { lpcurruser = document.getElementById('lpcurruserelt').value; document.getElementById('lpcurruserelt').value = ''; } if (typeof(lpcurrpass) == 'undefined') lpcurrpass=''; if (document.getElementById('lpcurrpasselt') && document.getElementById('lpcurrpasselt').value != '') { lpcurrpass = document.getElementById('lpcurrpasselt').value; document.getElementById('lpcurrpasselt').value = ''; } var lploc="1";var lponlyfill=null;var link=document.getElementById("i1668"); if(link&&typeof(g_lpclicked)=="undefined"){if(document.createEventObject){var evt = document.createEventObject();link.fireEvent("onclick",evt);}else{var evt2 = document.createEvent("MouseEvents");evt2.initMouseEvent("click", true, true, document.defaultView, 1, 0, 0, 0, 0, false, false, false, false, 0, null);link.dispatchEvent(evt2);}g_lpclicked=1;} if(lploc==3){var pholders=["idDiv_PWD_UsernameExample","idDiv_PWD_PasswordExample","i0116_hint","i0118_hint"]; for(var i=0;i

0 comments

Discussion is closed.

Feedback usabilla icon