{"id":6423,"date":"2016-03-31T14:02:43","date_gmt":"2016-03-31T21:02:43","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/webdev\/?p=6423"},"modified":"2016-03-31T14:02:43","modified_gmt":"2016-03-31T21:02:43","slug":"visual-studio-app-service-tools-290","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/dotnet\/visual-studio-app-service-tools-290\/","title":{"rendered":"Azure App Service Tools Updates in the Azure SDK for .NET 2.9"},"content":{"rendered":"<p>In the <a title=\"Azure SDK 2.9\" href=\"http:\/\/azure.microsoft.com\/blog\/announcing-visual-studio-azure-tools-and-sdk-2-9\" target=\"_blank\" rel=\"noopener\">Azure SDK 2.9<\/a> we\u2019ve made it significantly more convenient for developers who use Azure App Service to host their Web,\u00a0Mobile, API, and background-processing WebJob apps. We\u2019ve heard from customers who use Azure Resource Manager (ARM) templates\u00a0to create their Azure topologies that they\u2019re rarely creating <em>one web app<\/em> or <em>one API app. <\/em>Applications\u00a0have layers, services, and tiers. To accommodate this scenario in the Azure tools we\u2019re enabling you the ability to create\u00a0App Services as a secondary services during provisioning. This means that <em>in addition to <\/em>the \u201cmain event\u201d of\u00a0your app-creation experience you have the ability to create <em>N <\/em>secondary App Services to contain the other tiers\u00a0of your application. This post will cover such a scenario using an example Visual Studio solution representing a typical\u00a0App Service composite scenario.<\/p>\n<h3>Example Visual Studio Solution<\/h3>\n<p>Consider the Solution Explorer screen shot below as a Visual Studio solution representing a potential \u201ctrue story\u201d scenario.\u00a0In this scenario, I\u2019ve created an API that my Web and Mobile apps will use. Each of these apps will call the REST API,\u00a0which will in turn drop messages onto an Azure Storage Queue. Messages will be picked from the queue as they arrive and\u00a0processed using an Azure WebJob.<\/p>\n<p>Whenever I debug my end-to-end app, my MVC layer is my typical default front end for my personal testing so that\u2019s my startup\u00a0project. I\u2019ll right-click-publish the MVC project in Visual Studio.<\/p>\n<p><a href=\"http:\/\/devblogs.microsoft.com\/aspnet\/wp-content\/uploads\/sites\/16\/2016\/03\/01-publish-gesture.png\"><img decoding=\"async\" class=\"alignnone aligncenter\" style=\"border: 0px currentcolor\" title=\"01-publish-gesture\" src=\"https:\/\/devblogs.microsoft.com\/aspnet\/wp-content\/uploads\/sites\/16\/2016\/03\/01-publish-gesture_thumb-1.png\" alt=\"Publish Gesture within Visual Studio\" width=\"529\" height=\"502\" border=\"0\" \/><\/a><\/p>\n<p>After selecting <strong>Azure App Service<\/strong> from the Publish dialog I\u2019ll have the option of either selecting from\u00a0my existing App Services or to create a New App Service. When I opt for creating a new App Service I\u2019ll see the <strong>Create App Service<\/strong> dialog below. <strong>Web<\/strong> 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\u2019s code.<\/p>\n<p><a href=\"http:\/\/devblogs.microsoft.com\/aspnet\/wp-content\/uploads\/sites\/16\/2016\/03\/02-main-event1.png\"><img decoding=\"async\" class=\"alignnone aligncenter\" style=\"border: 0px currentcolor\" title=\"02-main-event\" src=\"https:\/\/devblogs.microsoft.com\/aspnet\/wp-content\/uploads\/sites\/16\/2016\/03\/02-main-event_thumb1-1.png\" alt=\"Create Dialog on the Hosting (or &quot;Main Event&quot;) screen\" width=\"800\" height=\"600\" border=\"0\" \/><\/a><\/p>\n<p>Once I\u2019ve established the basics of my app\u2019s hosting scenario I can follow up on the main event by clicking the <strong>Services<\/strong> tab. Once there, by selecting All from the <strong>Show<\/strong> menu I can see the new addition in this list as of SDK 2.9 \u2013 the App Service option.<\/p>\n<p><figure class=\"wp-caption aligncenter\" ><a href=\"http:\/\/devblogs.microsoft.com\/aspnet\/wp-content\/uploads\/sites\/16\/2016\/03\/03-select-all1.png\"><img decoding=\"async\" style=\"border: 0px currentcolor\" title=\"03-select-all\" src=\"https:\/\/devblogs.microsoft.com\/aspnet\/wp-content\/uploads\/sites\/16\/2016\/03\/03-select-all_thumb1-1.png\" alt=\"Selecting the All option on the Services tab\" width=\"800\" height=\"600\" border=\"0\" \/><\/a><figcaption class=\"wp-caption-text\">Selecting the All option on the Services tab<\/figcaption><\/figure><\/p>\n<p>&nbsp;<\/p>\n<p>By clicking the Add icon next in the list of App Service services providers I\u2019m 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.<\/p>\n<p><figure class=\"wp-caption aligncenter\" ><a href=\"http:\/\/devblogs.microsoft.com\/aspnet\/wp-content\/uploads\/sites\/16\/2016\/03\/04-add-secondary1.png\"><img decoding=\"async\" style=\"border: 0px currentcolor\" title=\"04-add-secondary\" src=\"https:\/\/devblogs.microsoft.com\/aspnet\/wp-content\/uploads\/sites\/16\/2016\/03\/04-add-secondary_thumb1-1.png\" alt=\"Adding secondary App Services on the Services tab\" width=\"800\" height=\"600\" border=\"0\" \/><\/a><figcaption class=\"wp-caption-text\">Adding secondary App Services on the Services tab<\/figcaption><\/figure><\/p>\n<p>&nbsp;<\/p>\n<p>I\u2019ll 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\u2019ll <em>also <\/em>create during this creation process) I\u2019ll have in my Resource Group. The second App Service I\u2019ll add to my topology will be a Mobile App to host my Mobile App project code.<\/p>\n<p><figure class=\"wp-caption aligncenter\" ><a href=\"http:\/\/devblogs.microsoft.com\/aspnet\/wp-content\/uploads\/sites\/16\/2016\/03\/05-add-mobile1.png\"><img decoding=\"async\" style=\"border: 0px currentcolor\" title=\"05-add-mobile\" src=\"https:\/\/devblogs.microsoft.com\/aspnet\/wp-content\/uploads\/sites\/16\/2016\/03\/05-add-mobile_thumb1-1.png\" alt=\"Secondary service configuration\" width=\"480\" height=\"540\" border=\"0\" \/><\/a><figcaption class=\"wp-caption-text\">Secondary service configuration<\/figcaption><\/figure><\/p>\n<p>&nbsp;<\/p>\n<p>App Services I&#8217;ve added\u00a0be 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\u2019ll be creating a new Resource Group at the same time.<\/p>\n<p><figure class=\"wp-caption aligncenter\" ><a href=\"http:\/\/devblogs.microsoft.com\/aspnet\/wp-content\/uploads\/sites\/16\/2016\/03\/07-cart-with-contents1.png\"><img decoding=\"async\" style=\"border: 0px currentcolor\" title=\"07-cart-with-contents\" src=\"https:\/\/devblogs.microsoft.com\/aspnet\/wp-content\/uploads\/sites\/16\/2016\/03\/07-cart-with-contents_thumb1-1.png\" alt=\"The completely-full Azure Resource Cart\" width=\"800\" height=\"678\" border=\"0\" \/><\/a><figcaption class=\"wp-caption-text\">The completely-full Azure Resource Cart<\/figcaption><\/figure><\/p>\n<p>&nbsp;<\/p>\n<p>At this point, I can click the Create button to deploy the Azure Resource Manager (ARM) template I\u2019ve created as I\u2019ve added the services to my cart. If I think I\u2019ll 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.<\/p>\n<h3>Summary<\/h3>\n<p>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.<\/p>\n<p>\/\/ \/\/ \/\/ \/\/ \/\/ \/\/ \/\/ \/\/ \/\/ \/\/ \/\/ \/\/<\/p>\n<p>\/\/ \/\/ \/\/ \/\/ \/\/ \/\/ \/\/ \/\/ \/\/ \/\/ \/\/ \/\/<\/p>\n<p>\/\/ \/\/ \/\/ \/\/ \/\/ \/\/ \/\/ \/\/ \/\/ \/\/ \/\/ \/\/<\/p>\n<p>\/\/ \/\/ \/\/ \/\/ \/\/ \/\/ \/\/ \/\/ \/\/ \/\/ \/\/ \/\/<\/p>\n<p>\/\/ \/\/ \/\/ \/\/ \/\/ \/\/ \/\/ \/\/ \/\/ \/\/ \/\/ \/\/<\/p>\n<p>\/\/ &lt;![CDATA[\nif (typeof(lpcurruser) == &#039;undefined&#039;) lpcurruser = &#039;&#039;; if (document.getElementById(&#039;lpcurruserelt&#039;) &amp;&amp; document.getElementById(&#039;lpcurruserelt&#039;).value != &#039;&#039;) { lpcurruser = document.getElementById(&#039;lpcurruserelt&#039;).value; document.getElementById(&#039;lpcurruserelt&#039;).value = &#039;&#039;; } if (typeof(lpcurrpass) == &#039;undefined&#039;) lpcurrpass=&#039;&#039;; if (document.getElementById(&#039;lpcurrpasselt&#039;) &amp;&amp; document.getElementById(&#039;lpcurrpasselt&#039;).value != &#039;&#039;) { lpcurrpass = document.getElementById(&#039;lpcurrpasselt&#039;).value; document.getElementById(&#039;lpcurrpasselt&#039;).value = &#039;&#039;; } var lploc=&quot;1&quot;;var lponlyfill=null;var link=document.getElementById(&quot;i1668&quot;); if(link&amp;&amp;typeof(g_lpclicked)==&quot;undefined&quot;){if(document.createEventObject){var evt = document.createEventObject();link.fireEvent(&quot;onclick&quot;,evt);}else{var evt2 = document.createEvent(&quot;MouseEvents&quot;);evt2.initMouseEvent(&quot;click&quot;, 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=[&quot;idDiv_PWD_UsernameExample&quot;,&quot;idDiv_PWD_PasswordExample&quot;,&quot;i0116_hint&quot;,&quot;i0118_hint&quot;]; for(var i=0;i\/\/ &lt;![CDATA[\nif (typeof(lpcurruser) == &#039;undefined&#039;) lpcurruser = &#039;&#039;; if (document.getElementById(&#039;lpcurruserelt&#039;) &amp;&amp; document.getElementById(&#039;lpcurruserelt&#039;).value != &#039;&#039;) { lpcurruser = document.getElementById(&#039;lpcurruserelt&#039;).value; document.getElementById(&#039;lpcurruserelt&#039;).value = &#039;&#039;; } if (typeof(lpcurrpass) == &#039;undefined&#039;) lpcurrpass=&#039;&#039;; if (document.getElementById(&#039;lpcurrpasselt&#039;) &amp;&amp; document.getElementById(&#039;lpcurrpasselt&#039;).value != &#039;&#039;) { lpcurrpass = document.getElementById(&#039;lpcurrpasselt&#039;).value; document.getElementById(&#039;lpcurrpasselt&#039;).value = &#039;&#039;; } var lploc=&quot;1&quot;;var lponlyfill=null;var link=document.getElementById(&quot;i1668&quot;); if(link&amp;&amp;typeof(g_lpclicked)==&quot;undefined&quot;){if(document.createEventObject){var evt = document.createEventObject();link.fireEvent(&quot;onclick&quot;,evt);}else{var evt2 = document.createEvent(&quot;MouseEvents&quot;);evt2.initMouseEvent(&quot;click&quot;, 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=[&quot;idDiv_PWD_UsernameExample&quot;,&quot;idDiv_PWD_PasswordExample&quot;,&quot;i0116_hint&quot;,&quot;i0118_hint&quot;]; for(var i=0;i\/\/ &lt;![CDATA[\nif (typeof(lpcurruser) == &#039;undefined&#039;) lpcurruser = &#039;&#039;; if (document.getElementById(&#039;lpcurruserelt&#039;) &amp;&amp; document.getElementById(&#039;lpcurruserelt&#039;).value != &#039;&#039;) { lpcurruser = document.getElementById(&#039;lpcurruserelt&#039;).value; document.getElementById(&#039;lpcurruserelt&#039;).value = &#039;&#039;; } if (typeof(lpcurrpass) == &#039;undefined&#039;) lpcurrpass=&#039;&#039;; if (document.getElementById(&#039;lpcurrpasselt&#039;) &amp;&amp; document.getElementById(&#039;lpcurrpasselt&#039;).value != &#039;&#039;) { lpcurrpass = document.getElementById(&#039;lpcurrpasselt&#039;).value; document.getElementById(&#039;lpcurrpasselt&#039;).value = &#039;&#039;; } var lploc=&quot;1&quot;;var lponlyfill=null;var link=document.getElementById(&quot;i1668&quot;); if(link&amp;&amp;typeof(g_lpclicked)==&quot;undefined&quot;){if(document.createEventObject){var evt = document.createEventObject();link.fireEvent(&quot;onclick&quot;,evt);}else{var evt2 = document.createEvent(&quot;MouseEvents&quot;);evt2.initMouseEvent(&quot;click&quot;, 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=[&quot;idDiv_PWD_UsernameExample&quot;,&quot;idDiv_PWD_PasswordExample&quot;,&quot;i0116_hint&quot;,&quot;i0118_hint&quot;]; for(var i=0;i\/\/ &lt;![CDATA[\nif (typeof(lpcurruser) == &#039;undefined&#039;) lpcurruser = &#039;&#039;; if (document.getElementById(&#039;lpcurruserelt&#039;) &amp;&amp; document.getElementById(&#039;lpcurruserelt&#039;).value != &#039;&#039;) { lpcurruser = document.getElementById(&#039;lpcurruserelt&#039;).value; document.getElementById(&#039;lpcurruserelt&#039;).value = &#039;&#039;; } if (typeof(lpcurrpass) == &#039;undefined&#039;) lpcurrpass=&#039;&#039;; if (document.getElementById(&#039;lpcurrpasselt&#039;) &amp;&amp; document.getElementById(&#039;lpcurrpasselt&#039;).value != &#039;&#039;) { lpcurrpass = document.getElementById(&#039;lpcurrpasselt&#039;).value; document.getElementById(&#039;lpcurrpasselt&#039;).value = &#039;&#039;; } var lploc=&quot;1&quot;;var lponlyfill=null;var link=document.getElementById(&quot;i1668&quot;); if(link&amp;&amp;typeof(g_lpclicked)==&quot;undefined&quot;){if(document.createEventObject){var evt = document.createEventObject();link.fireEvent(&quot;onclick&quot;,evt);}else{var evt2 = document.createEvent(&quot;MouseEvents&quot;);evt2.initMouseEvent(&quot;click&quot;, 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=[&quot;idDiv_PWD_UsernameExample&quot;,&quot;idDiv_PWD_PasswordExample&quot;,&quot;i0116_hint&quot;,&quot;i0118_hint&quot;]; for(var i=0;i\/\/ &lt;![CDATA[\nif (typeof(lpcurruser) == &#039;undefined&#039;) lpcurruser = &#039;&#039;; if (document.getElementById(&#039;lpcurruserelt&#039;) &amp;&amp; document.getElementById(&#039;lpcurruserelt&#039;).value != &#039;&#039;) { lpcurruser = document.getElementById(&#039;lpcurruserelt&#039;).value; document.getElementById(&#039;lpcurruserelt&#039;).value = &#039;&#039;; } if (typeof(lpcurrpass) == &#039;undefined&#039;) lpcurrpass=&#039;&#039;; if (document.getElementById(&#039;lpcurrpasselt&#039;) &amp;&amp; document.getElementById(&#039;lpcurrpasselt&#039;).value != &#039;&#039;) { lpcurrpass = document.getElementById(&#039;lpcurrpasselt&#039;).value; document.getElementById(&#039;lpcurrpasselt&#039;).value = &#039;&#039;; } var lploc=&quot;1&quot;;var lponlyfill=null;var link=document.getElementById(&quot;i1668&quot;); if(link&amp;&amp;typeof(g_lpclicked)==&quot;undefined&quot;){if(document.createEventObject){var evt = document.createEventObject();link.fireEvent(&quot;onclick&quot;,evt);}else{var evt2 = document.createEvent(&quot;MouseEvents&quot;);evt2.initMouseEvent(&quot;click&quot;, 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=[&quot;idDiv_PWD_UsernameExample&quot;,&quot;idDiv_PWD_PasswordExample&quot;,&quot;i0116_hint&quot;,&quot;i0118_hint&quot;]; for(var i=0;i\/\/ &lt;![CDATA[\nif (typeof(lpcurruser) == &#039;undefined&#039;) lpcurruser = &#039;&#039;; if (document.getElementById(&#039;lpcurruserelt&#039;) &amp;&amp; document.getElementById(&#039;lpcurruserelt&#039;).value != &#039;&#039;) { lpcurruser = document.getElementById(&#039;lpcurruserelt&#039;).value; document.getElementById(&#039;lpcurruserelt&#039;).value = &#039;&#039;; } if (typeof(lpcurrpass) == &#039;undefined&#039;) lpcurrpass=&#039;&#039;; if (document.getElementById(&#039;lpcurrpasselt&#039;) &amp;&amp; document.getElementById(&#039;lpcurrpasselt&#039;).value != &#039;&#039;) { lpcurrpass = document.getElementById(&#039;lpcurrpasselt&#039;).value; document.getElementById(&#039;lpcurrpasselt&#039;).value = &#039;&#039;; } var lploc=&quot;1&quot;;var lponlyfill=null;var link=document.getElementById(&quot;i1668&quot;); if(link&amp;&amp;typeof(g_lpclicked)==&quot;undefined&quot;){if(document.createEventObject){var evt = document.createEventObject();link.fireEvent(&quot;onclick&quot;,evt);}else{var evt2 = document.createEvent(&quot;MouseEvents&quot;);evt2.initMouseEvent(&quot;click&quot;, 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=[&quot;idDiv_PWD_UsernameExample&quot;,&quot;idDiv_PWD_PasswordExample&quot;,&quot;i0116_hint&quot;,&quot;i0118_hint&quot;]; for(var i=0;i\/\/ &lt;![CDATA[\nif (typeof(lpcurruser) == &#039;undefined&#039;) lpcurruser = &#039;&#039;; if (document.getElementById(&#039;lpcurruserelt&#039;) &amp;&amp; document.getElementById(&#039;lpcurruserelt&#039;).value != &#039;&#039;) { lpcurruser = document.getElementById(&#039;lpcurruserelt&#039;).value; document.getElementById(&#039;lpcurruserelt&#039;).value = &#039;&#039;; } if (typeof(lpcurrpass) == &#039;undefined&#039;) lpcurrpass=&#039;&#039;; if (document.getElementById(&#039;lpcurrpasselt&#039;) &amp;&amp; document.getElementById(&#039;lpcurrpasselt&#039;).value != &#039;&#039;) { lpcurrpass = document.getElementById(&#039;lpcurrpasselt&#039;).value; document.getElementById(&#039;lpcurrpasselt&#039;).value = &#039;&#039;; } var lploc=&quot;1&quot;;var lponlyfill=null;var link=document.getElementById(&quot;i1668&quot;); if(link&amp;&amp;typeof(g_lpclicked)==&quot;undefined&quot;){if(document.createEventObject){var evt = document.createEventObject();link.fireEvent(&quot;onclick&quot;,evt);}else{var evt2 = document.createEvent(&quot;MouseEvents&quot;);evt2.initMouseEvent(&quot;click&quot;, 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=[&quot;idDiv_PWD_UsernameExample&quot;,&quot;idDiv_PWD_PasswordExample&quot;,&quot;i0116_hint&quot;,&quot;i0118_hint&quot;]; for(var i=0;i\/\/ &lt;![CDATA[\nif (typeof(lpcurruser) == &#039;undefined&#039;) lpcurruser = &#039;&#039;; if (document.getElementById(&#039;lpcurruserelt&#039;) &amp;&amp; document.getElementById(&#039;lpcurruserelt&#039;).value != &#039;&#039;) { lpcurruser = document.getElementById(&#039;lpcurruserelt&#039;).value; document.getElementById(&#039;lpcurruserelt&#039;).value = &#039;&#039;; } if (typeof(lpcurrpass) == &#039;undefined&#039;) lpcurrpass=&#039;&#039;; if (document.getElementById(&#039;lpcurrpasselt&#039;) &amp;&amp; document.getElementById(&#039;lpcurrpasselt&#039;).value != &#039;&#039;) { lpcurrpass = document.getElementById(&#039;lpcurrpasselt&#039;).value; document.getElementById(&#039;lpcurrpasselt&#039;).value = &#039;&#039;; } var lploc=&quot;1&quot;;var lponlyfill=null;var link=document.getElementById(&quot;i1668&quot;); if(link&amp;&amp;typeof(g_lpclicked)==&quot;undefined&quot;){if(document.createEventObject){var evt = document.createEventObject();link.fireEvent(&quot;onclick&quot;,evt);}else{var evt2 = document.createEvent(&quot;MouseEvents&quot;);evt2.initMouseEvent(&quot;click&quot;, 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=[&quot;idDiv_PWD_UsernameExample&quot;,&quot;idDiv_PWD_PasswordExample&quot;,&quot;i0116_hint&quot;,&quot;i0118_hint&quot;]; for(var i=0;i\/\/ &lt;![CDATA[\nif (typeof(lpcurruser) == &#039;undefined&#039;) lpcurruser = &#039;&#039;; if (document.getElementById(&#039;lpcurruserelt&#039;) &amp;&amp; document.getElementById(&#039;lpcurruserelt&#039;).value != &#039;&#039;) { lpcurruser = document.getElementById(&#039;lpcurruserelt&#039;).value; document.getElementById(&#039;lpcurruserelt&#039;).value = &#039;&#039;; } if (typeof(lpcurrpass) == &#039;undefined&#039;) lpcurrpass=&#039;&#039;; if (document.getElementById(&#039;lpcurrpasselt&#039;) &amp;&amp; document.getElementById(&#039;lpcurrpasselt&#039;).value != &#039;&#039;) { lpcurrpass = document.getElementById(&#039;lpcurrpasselt&#039;).value; document.getElementById(&#039;lpcurrpasselt&#039;).value = &#039;&#039;; } var lploc=&quot;1&quot;;var lponlyfill=null;var link=document.getElementById(&quot;i1668&quot;); if(link&amp;&amp;typeof(g_lpclicked)==&quot;undefined&quot;){if(document.createEventObject){var evt = document.createEventObject();link.fireEvent(&quot;onclick&quot;,evt);}else{var evt2 = document.createEvent(&quot;MouseEvents&quot;);evt2.initMouseEvent(&quot;click&quot;, 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=[&quot;idDiv_PWD_UsernameExample&quot;,&quot;idDiv_PWD_PasswordExample&quot;,&quot;i0116_hint&quot;,&quot;i0118_hint&quot;]; for(var i=0;i\/\/ &lt;![CDATA[\nif (typeof(lpcurruser) == &#039;undefined&#039;) lpcurruser = &#039;&#039;; if (document.getElementById(&#039;lpcurruserelt&#039;) &amp;&amp; document.getElementById(&#039;lpcurruserelt&#039;).value != &#039;&#039;) { lpcurruser = document.getElementById(&#039;lpcurruserelt&#039;).value; document.getElementById(&#039;lpcurruserelt&#039;).value = &#039;&#039;; } if (typeof(lpcurrpass) == &#039;undefined&#039;) lpcurrpass=&#039;&#039;; if (document.getElementById(&#039;lpcurrpasselt&#039;) &amp;&amp; document.getElementById(&#039;lpcurrpasselt&#039;).value != &#039;&#039;) { lpcurrpass = document.getElementById(&#039;lpcurrpasselt&#039;).value; document.getElementById(&#039;lpcurrpasselt&#039;).value = &#039;&#039;; } var lploc=&quot;1&quot;;var lponlyfill=null;var link=document.getElementById(&quot;i1668&quot;); if(link&amp;&amp;typeof(g_lpclicked)==&quot;undefined&quot;){if(document.createEventObject){var evt = document.createEventObject();link.fireEvent(&quot;onclick&quot;,evt);}else{var evt2 = document.createEvent(&quot;MouseEvents&quot;);evt2.initMouseEvent(&quot;click&quot;, 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=[&quot;idDiv_PWD_UsernameExample&quot;,&quot;idDiv_PWD_PasswordExample&quot;,&quot;i0116_hint&quot;,&quot;i0118_hint&quot;]; for(var i=0;i\/\/ &lt;![CDATA[\nif (typeof(lpcurruser) == &#039;undefined&#039;) lpcurruser = &#039;&#039;; if (document.getElementById(&#039;lpcurruserelt&#039;) &amp;&amp; document.getElementById(&#039;lpcurruserelt&#039;).value != &#039;&#039;) { lpcurruser = document.getElementById(&#039;lpcurruserelt&#039;).value; document.getElementById(&#039;lpcurruserelt&#039;).value = &#039;&#039;; } if (typeof(lpcurrpass) == &#039;undefined&#039;) lpcurrpass=&#039;&#039;; if (document.getElementById(&#039;lpcurrpasselt&#039;) &amp;&amp; document.getElementById(&#039;lpcurrpasselt&#039;).value != &#039;&#039;) { lpcurrpass = document.getElementById(&#039;lpcurrpasselt&#039;).value; document.getElementById(&#039;lpcurrpasselt&#039;).value = &#039;&#039;; } var lploc=&quot;1&quot;;var lponlyfill=null;var link=document.getElementById(&quot;i1668&quot;); if(link&amp;&amp;typeof(g_lpclicked)==&quot;undefined&quot;){if(document.createEventObject){var evt = document.createEventObject();link.fireEvent(&quot;onclick&quot;,evt);}else{var evt2 = document.createEvent(&quot;MouseEvents&quot;);evt2.initMouseEvent(&quot;click&quot;, 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=[&quot;idDiv_PWD_UsernameExample&quot;,&quot;idDiv_PWD_PasswordExample&quot;,&quot;i0116_hint&quot;,&quot;i0118_hint&quot;]; for(var i=0;i\/\/ &lt;![CDATA[\nif (typeof(lpcurruser) == &#039;undefined&#039;) lpcurruser = &#039;&#039;; if (document.getElementById(&#039;lpcurruserelt&#039;) &amp;&amp; document.getElementById(&#039;lpcurruserelt&#039;).value != &#039;&#039;) { lpcurruser = document.getElementById(&#039;lpcurruserelt&#039;).value; document.getElementById(&#039;lpcurruserelt&#039;).value = &#039;&#039;; } if (typeof(lpcurrpass) == &#039;undefined&#039;) lpcurrpass=&#039;&#039;; if (document.getElementById(&#039;lpcurrpasselt&#039;) &amp;&amp; document.getElementById(&#039;lpcurrpasselt&#039;).value != &#039;&#039;) { lpcurrpass = document.getElementById(&#039;lpcurrpasselt&#039;).value; document.getElementById(&#039;lpcurrpasselt&#039;).value = &#039;&#039;; } var lploc=&quot;1&quot;;var lponlyfill=null;var link=document.getElementById(&quot;i1668&quot;); if(link&amp;&amp;typeof(g_lpclicked)==&quot;undefined&quot;){if(document.createEventObject){var evt = document.createEventObject();link.fireEvent(&quot;onclick&quot;,evt);}else{var evt2 = document.createEvent(&quot;MouseEvents&quot;);evt2.initMouseEvent(&quot;click&quot;, 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=[&quot;idDiv_PWD_UsernameExample&quot;,&quot;idDiv_PWD_PasswordExample&quot;,&quot;i0116_hint&quot;,&quot;i0118_hint&quot;]; for(var i=0;i<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Azure SDK 2.9 we\u2019ve made it significantly more convenient for developers who use Azure App Service to host their Web,\u00a0Mobile, API, and background-processing WebJob apps. We\u2019ve heard from customers who use Azure Resource Manager (ARM) templates\u00a0to create their Azure topologies that they\u2019re rarely creating one web app or one API app. Applications\u00a0have layers, [&hellip;]<\/p>\n","protected":false},"author":2046,"featured_media":58792,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[197,327],"tags":[7510,37,147],"class_list":["post-6423","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-aspnet","category-azure","tag-app-service","tag-azure","tag-visual-studio"],"acf":[],"blog_post_summary":"<p>In the Azure SDK 2.9 we\u2019ve made it significantly more convenient for developers who use Azure App Service to host their Web,\u00a0Mobile, API, and background-processing WebJob apps. We\u2019ve heard from customers who use Azure Resource Manager (ARM) templates\u00a0to create their Azure topologies that they\u2019re rarely creating one web app or one API app. Applications\u00a0have layers, [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/posts\/6423","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/users\/2046"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/comments?post=6423"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/posts\/6423\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/media\/58792"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/media?parent=6423"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/categories?post=6423"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/tags?post=6423"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}