【问题标题】:Is there a way to tell via REST if an Azure VM is started or not?有没有办法通过 REST 判断 Azure VM 是否已启动?
【发布时间】:2013-10-04 02:40:37
【问题描述】:

我在 Azure 中有几个持久性 VM,我想在某些情况下以编程方式启动/停止。但它们是手动启动或停止的。

有没有办法通过 REST API 判断 VM 是否已启动?

【问题讨论】:

    标签: rest azure virtual-machine


    【解决方案1】:

    您可以调用Get Deployment 操作(它也适用于您的持久性虚拟机),这将为您提供部署状态,您可以使用该状态来决定您需要在您的虚拟机上执行操作。

    class Program
        {
            static string subscriptionId = "subscription id";
            static string certificateData = "Data from ManagementCertificate node in publish setting file ";
            static string cloudServiceName = "name of the cloud service";
            static X509Certificate2 cert = null;
            static void Main(string[] args)
            {
                cert = new X509Certificate2(Convert.FromBase64String(certificateData));
                Test2();
                Console.ReadLine();
            }
    
            static void Test2()
            {
                string endpoint = string.Format("https://management.core.windows.net/{0}/services/hostedservices/{1}/deploymentslots/production", subscriptionId, cloudServiceName);
                HttpWebRequest req = (HttpWebRequest)WebRequest.Create(endpoint);
                req.ClientCertificates.Add(cert);
                req.ContentType = "application/xml";
                req.Headers.Add("x-ms-version", "2013-03-01");
                req.Method = "GET";
                try
                {
                    using (var resp = req.GetResponse())
                    {
                        using (StreamReader sr = new StreamReader(resp.GetResponseStream()))
                        {
                            var responseData = sr.ReadToEnd();
                            Console.WriteLine(responseData);
                        }
                    }
                }
                catch (WebException webEx)
                {
                    using (var resp = webEx.Response)
                    {
                        using (StreamReader sr = new StreamReader(resp.GetResponseStream()))
                        {
                            var errorDetails = sr.ReadToEnd();
                            Console.WriteLine(errorDetails);
                        }
                    }
                }
    
            }
    

    【讨论】:

    • 谢谢,但我似乎无法让它工作。如果我使用 services/hostedservices/{0}/deployments/{1} 我没有得到任何有用的信息,如果我在登台或生产中使用 services/hostedservices/{0}/deploymentslots/{1} 我得到 ResourceNotFound代码>。你知道我应该怎么称呼它吗?
    • 嗯...这很奇怪。我使用控制台应用程序进行了尝试,并得到了正确的响应。我已经用我使用的代码更新了我的回复。
    • 非常感谢。我使用的代码与您非常相似,但是当您的代码工作时,我尝试了更多测试,发现我传递的是实例名称而不是服务名称。