Deploying a web app with .NET
Overview
A walkthrough on creating a new web app from a Console app using .NET. This is not to be confused with deploying new code to an existing web app, it is a programmatic way to create web apps in a similar fashion to ARM or creation through the portal.
Walkthrough
1. To begin, create a new C# console application in Visual Studios.
2. Next add the required packages. For the Microsoft.Azure packages, I found the easiest way to quickly install them was via npm in the VS Console. You can copy the desired package and search for it on nugget.org.
- Installing the CLI: https://docs.npmjs.com/cli/install
- Searching for Nuget Packages: https://www.nuget.org/packages/
using Microsoft.Azure.Management.ResourceManager;
using Microsoft.Azure.Management.Authorization;
using System;
using Microsoft.Azure.Management.Compute;
using Microsoft.Rest.Azure.Authentication;
using Microsoft.Azure.Management.WebSites;
using Microsoft.Azure.Management.WebSites.Models;
using System.Threading.Tasks;
using System.Collections.Generic;
3. The next step is to create a service principal that can be used to authenticate the requests.
- Creating a service principal using the portal
- Create a service principal using PowerShell
The information created in PowerShell or via the portal will be added in this portion of the code:
static string _tenantId = "";
private static string _clientId = "";
private static string _clientSecret = "";
private static string _subscriptionId = "";
4. The last step is implementing the code. Instead of trying to update the entire SiteConfig section in one go, I found that updating the individuals sections such as the connection strings and the app settings, separately, was easier.
Example:
AppSettingsResponse = webClient.WebApps.UpdateApplicationSettings
connectionstringResponse = webClient.WebApps.UpdateConnectionStrings
Example Program.cs
using Microsoft.Azure.Management.ResourceManager;
using Microsoft.Azure.Management.Authorization;
using System;
using Microsoft.Azure.Management.Compute;
using Microsoft.Rest.Azure.Authentication;
using Microsoft.Azure.Management.WebSites;
using Microsoft.Azure.Management.WebSites.Models;
using System.Threading.Tasks;
using System.Collections.Generic;
namespace SimplifiedWebAppCreate
{
class Program
{
private static string _tenantId = "****";
private static string _clientId = "****";
private static string _clientSecret = "****";
private static string _subscriptionId = "****";
static void Main(string[] args)
{
Site newWebApp = null;
string resourceGroupName = "*ResourceGroupName*";
string siteName = "*MyWebAppName*";
string location = "southcentralus";
string serverFarmId = "/subscriptions/*SubscriptionId*/resourceGroups/*ResourceGroupName*/providers/Microsoft.Web/serverfarms/*ServerFarmName*";
try
{
var serviceCreds = Task.Run(() => ApplicationTokenProvider.LoginSilentAsync(_tenantId, _clientId, _clientSecret)).Result;
var webClient = new WebSiteManagementClient(serviceCreds);
webClient.SubscriptionId = _subscriptionId;
//CREATE the web app
var site = webClient.WebApps.CreateOrUpdate(resourceGroupName, siteName, new Site
{
Location = location,
ServerFarmId = serverFarmId,
});
//ADD App Settings
const string settingName = "Application Setting1", settingValue = "Setting Value 1";
var appSetting = new StringDictionary { Name = settingName, Location = location, Properties = new Dictionary<string, string> { { settingName, settingValue } } };
var appSettingsResponse = webClient.WebApps.UpdateApplicationSettings(
resourceGroupName,
siteName,
appSetting);
//ADD Conneciton Strings
var connectionStringValuePair = new ConnStringValueTypePair("*ConnectionStringValue*", ConnectionStringType.MySql);
var connectionString = new ConnectionStringDictionary { Location = location, Properties = new Dictionary<string, ConnStringValueTypePair> { { "*Connection String Name*", connectionStringValuePair } } };
var connectionstringResponse = webClient.WebApps.UpdateConnectionStrings(resourceGroupName, siteName, connectionString);
appSettingsResponse = webClient.WebApps.ListApplicationSettings(resourceGroupName, siteName);
connectionstringResponse = webClient.WebApps.ListConnectionStrings(resourceGroupName, siteName);
Console.Write("Getting a site by name");
newWebApp = webClient.WebApps.Get(resourceGroupName, siteName);
Console.Write("Found site named {0}", newWebApp.Name);
}
catch (Exception ex)
{
Console.Write(ex.Message);
}
}
}
}