3
votes

How can I restart Web-Apps and API-Apps on Azure programmatically?

(I'd like to call it from another API-App within the same App service plan.)

3
Why do you need to restart them?Brendan Green
After re-creating a DocumentDB Collection, some static members of repositories are not valid anymore. So in this scenario (not every-day use), it seems the most easy approach.Thomas Mutzl
Have you checked the powershell/cli apis? They should have either a restart or a stop/start api on them. Worst case scenario you could just kill the w3wp process on the site :)Zain Rizvi

3 Answers

2
votes

There's also the "Microsoft Azure Management Libraries" Nuget that allows you to work with Azure services from inside of applications.

See this page for an example on how to create new web sites from inside of an Azure Web site. Restarting web services work in a similar way to creating new services. See this page for a list of available web site related methods.

Also, for authenticating is used certificate base authentication, see this page for more details on that.

Bellow is a short command line program that will restart all websites in all the webspaces you got in your Azure subscription. It works kinda like an iisreset for Azure Web Sites.

The code is based on samples taken from the links earlier mentioned:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.WindowsAzure.Management.WebSites;
using Microsoft.WindowsAzure;
using System.Security.Cryptography.X509Certificates;
using Microsoft.WindowsAzure.Management.WebSites.Models;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var subscriptionId = "[INSERT_YOUR_SUBSCRIPTION_ID_HERE]";
            var cred = new CertificateCloudCredentials(subscriptionId, GetCertificate());
            var client = new WebSiteManagementClient(cred);

            WebSpacesListResponse webspaces = client.WebSpaces.List();

            webspaces.Select(p =>
            {
                Console.WriteLine("Processing webspace {0}", p.Name);

                WebSpacesListWebSitesResponse websitesInWebspace = client.WebSpaces.ListWebSites(p.Name,
                                new WebSiteListParameters()
                                {
                                });

                websitesInWebspace.Select(o =>
                {
                    Console.Write(" - Restarting {0} ... ", o.Name);

                    OperationResponse operation = client.WebSites.Restart(p.Name, o.Name);

                    Console.WriteLine(operation.StatusCode.ToString());

                    return o;
                }).ToArray();

                return p;
            }).ToArray();

            if(System.Diagnostics.Debugger.IsAttached)
            {
                Console.WriteLine("Press anykey to exit");
                Console.Read();
            }
        }

        private static X509Certificate2 GetCertificate()
        {
            string certPath = Environment.CurrentDirectory + "\\" + "[NAME_OF_PFX_CERTIFICATE]";

            var x509Cert = new X509Certificate2(certPath,"[PASSWORD_FOR_PFX_CERTIFICATE]");

            return x509Cert;
        }
    }
}

Another alternative, if you can't find the function you need from the above mentioned library, you can also run powershell commands programmatically from inside of your application. You most likely will need to move, the application that is supposed to run these cmdlets, to a virtual machine to be able to load the needed powershell modules. See this page for more information on running powershell cmdlets programmatically.

1
votes

You can use Powershell to do this. The relevant commands are:

Start-AzureWebsite -Name “xxxx”

Stop-AzureWebsite -Name “xxxx”

You can find help on these commands at the following links: https://msdn.microsoft.com/en-us/library/azure/dn495288.aspx https://msdn.microsoft.com/en-us/library/azure/dn495185.aspx

1
votes

I think handling the base REST API is much better option. The Azure SDK changes quite a lot and lacks good documentation.

Here is an up-to-date sample code: https://github.com/davidebbo/AzureWebsitesSamples/

You can adapt it to your needs.