如何通过编程了解azure角色中的当前区域?

如何通过编程了解azure角色中的当前区域?,azure,Azure,我需要以编程方式找到我当前角色所在的当前区域(例如“美国西部”或“美国东部”)。是否有任何API可以找到此信息?只有使用管理API才能获得该信息 通过REST或您可以使用c#Windows Azure管理库(在nuget上预发布) 但需要注意的是,您需要设置管理证书来获取信息 一个更简单的选择是在云服务中创建一个设置,并在创建部署配置时设置值。我这样做,并为我的目标区域提供部署配置 using( var azure = CloudContext.Clients.CreateCompute

我需要以编程方式找到我当前角色所在的当前区域(例如“美国西部”或“美国东部”)。是否有任何API可以找到此信息?

只有使用管理API才能获得该信息

通过REST或您可以使用c#Windows Azure管理库(在nuget上预发布)

但需要注意的是,您需要设置管理证书来获取信息

一个更简单的选择是在云服务中创建一个设置,并在创建部署配置时设置值。我这样做,并为我的目标区域提供部署配置

    using( var azure = CloudContext.Clients.CreateComputeManagementClient(...))
    {
       var service = await  azure.HostedServices.GetDetailedAsync("servicename");
      //   service.Properties.Location
      //  service.Properties.AffinityGroup;

    }
    using(var azure = CloudContext.Clients.CreateManagementClient(...))
    {
      var affinityGroup = await  azure.AffinityGroups.GetAsync("name",new CancellationToken());
      //  affinityGroup.Location
    }
这里。。。是凭据,可以是管理证书,也可以是WAAD oauth令牌。 (ADAL:Active Directory身份验证库)可用于令牌

以下是从证书获取凭据的代码:

    public static CertificateCloudCredentials GetCertificateCloudCredentials(
        string certificateThumbprint, string subscriptionId)
    {
        var certificate = CertificateHelper.LoadCertificate(
            StoreName.My,
            StoreLocation.LocalMachine,
            certificateThumbprint);

        if (certificate == null)
            throw new Exception(
                string.Format("Certificate with thumbprint '{0}' not found",
                certificateThumbprint));

        var cred = new CertificateCloudCredentials(
            subscriptionId,
            certificate
         );
        return cred;
    }
考虑在服务管理API中使用。当您提供您的角色所属的服务时,您可以检索类似于以下内容的响应。注意我用星号标出的位置字段

<?xml version="1.0" encoding="utf-8"?>
<HostedService xmlns="http://schemas.microsoft.com/windowsazure">
  <Url>hosted-service-url</Url>
  <ServiceName>hosted-service-name</ServiceName>
  <HostedServiceProperties>
    <Description>description</Description>
    <AffinityGroup>name-of-affinity-group</AffinityGroup> 
    **<Location>location-of-service</Location >**
    <Label>base-64-encoded-name-of-service</Label>
    <Status>current-status-of-service</Status>
    <DateCreated>creation-date-of-service</DateCreated>
    <DateLastModified>last-modification-date-of-service</DateLastModified>
    <ExtendedProperties>
      <ExtendedProperty>
        <Name>name-of-property</Name>
        <Value>value-of-property</Value>
      </ExtendedProperty>
    </ExtendedProperties>
    <GuestAgentType>type-of-guest-agent</GuestAgentType>
  </HostedServiceProperties>
  <DefaultWinRmCertificateThumbprint>thumbprint-of-winrm-certificate</DefaultWinRmCertificateThumbprint>
</HostedService>

托管服务url
托管服务名称
描述
关联组的名称
**服务地点**
base-64-encoded-name-of-service
服务现状
创建服务日期
最后更改服务日期
物业名称
财产价值
客人代理的类型
winrm证书的指纹

该信息可从中获得。Azure公共云中运行的任何VM的REST端点都是
http://169.254.169.254/metadata/instance?api-版本=2017-04-02
。元数据对象包含两个子对象,一个用于“计算”,另一个用于“网络”。区域名称出现在“计算”对象的“位置”成员中

访问IMDS数据各种元素的多语言示例代码可从中获得。2018-10-01版IMDS API提供了比我在这里展示的信息多得多的信息;有关详细信息,请参阅

$ curl -s -H Metadata:True "http://169.254.169.254/metadata/instance?api-version=2017-04-02&format=json" | jq .
{
  "compute": {
    "location": "westus2",
    "name": "samplevm",
    "offer": "UbuntuServer",
    "osType": "Linux",
    "platformFaultDomain": "0",
    "platformUpdateDomain": "0",
    "publisher": "Canonical",
    "sku": "18.04-LTS",
    "version": "18.04.201904020",
    "vmId": "(redacted)",
    "vmSize": "Standard_D2s_v3"
  },
  "network": {
    "interface": [
      {
        "ipv4": {
          "ipAddress": [
            {
              "privateIpAddress": "10.0.0.7",
              "publicIpAddress": ""
            }
          ],
          "subnet": [
            {
              "address": "10.0.0.0",
              "prefix": "24"
            }
          ]
        },
        "ipv6": {
          "ipAddress": []
        },
        "macAddress": "(redacted)"
      }
    ]
  }
}

你需要从角色内部还是外部找到它?Gaurav,你是说你可以在没有管理api的情况下从角色内部找到它:)@pksorensen你仍然需要使用管理api,但在那里你必须自下而上。如果代码在角色中运行,则您将拥有部署id。然后,您将遍历所有云服务以找到匹配的部署id,然后获取云服务的属性,如您在下面的回答中所述。呵呵,希望您为我们实现了一些新功能;)英雄联盟非常老的博客文章,有点离题,但这应该会有帮助:。说明提供此功能的实际API调用(与C#方法相同)会更有帮助。这取决于采取的路线。我可以在几个小时内给出c#管理库的c#代码。添加到@GregD的回答中:请注意,如果您的云服务是关联组的一部分,则不会返回位置字段。在这种情况下,您需要获取关联组的属性并获取该关联组的位置。这也是云服务的位置。这与您从C#management库获得的信息相同。在部署中,我们所有的亲和群都附加了-weu-wus-sea for west europe ect,这样很容易知道亲和群的位置。再一次。将元数据作为设置放入部署文件很简单,并且节省了从管理api获取信息的大量时间。