如何使用Azure RM API检测子域是否可用?

时间:2018-03-19 20:21:54

标签: c# azure azure-resource-manager azure-sdk-.net

在旧世界(Azure RM API之前),我们可以轻松检测到子域可用性,如下所示:

public async Task<HostedServiceCheckNameAvailabilityResponse> CheckNameAvailability(string name)
{
    using (var client = new ComputeManagementClient(await subscription.GetAuthToken()))
    {
        return await client.HostedServices.CheckNameAvailabilityAsync(name);
    }
}

这会告诉您子域是否可以使用,并且效果很好。

在Azure RM中,我没有找到任何类似的方法 - 我已经将下面的方法写成了最后的手段 - 但它是一个可怕的黑客 - 而且启动速度慢;如果子域已经存在,则只需要大约3到4秒的时间来告诉您,但如果它不存在,则最多可能需要25秒才能运行...(创建和删除IP需要大约10-每个12秒),真的很糟糕。

public static async Task<bool> IsSubDomainAvailable
(
    IAzure azure, 
    string region, 
    string subDomain
)
{
    // TODO: This is a bit of a hack, but it's the only way we've found in the RM
    //       model to test for subdomain availability.

    var rgName = $"dnstest{Guid.NewGuid()}".ToLower().Replace("-", string.Empty);
    var resourceGroup = await azure.ResourceGroups.Define(rgName)
        .WithRegion(region)
        .CreateAsync();

    try
    {
        var ipAddy = await azure.PublicIPAddresses.Define("dnstest")
            .WithRegion(region)
            .WithExistingResourceGroup(rgName)
            .WithLeafDomainLabel(subDomain)
            .CreateAsync();

        await azure.PublicIPAddresses.DeleteByIdAsync(ipAddy.Id);

        return true;
    }
    catch (CloudException cEx)
    {
        if (cEx.Response.StatusCode == HttpStatusCode.BadRequest
            && cEx.Message.ToUpperInvariant().Contains("ALREADY USED"))
        {
            return false;
        }

        throw;
    }
    finally
    {
        await azure.ResourceGroups.BeginDeleteByNameAsync(rgName);
    }
}

所以我的问题是,是否有更好/更直接的方法来检查子域可用性,使用Azure RM API?

1 个答案:

答案 0 :(得分:1)

  

所以我的问题是,是否有更好/更直接的方法来检查子域可用性,使用Azure RM API?

我们可以使用 NetworkManagementClient 检查子域可用性,以下是演示代码。

<template>
  <div @click.capture="openGroupModal($event)">
    <tree-view :data="{1:1,2:{a:'a'}}" :options="{maxDepth: 3}"></tree-view>
  </div>
</template>

<script>
export default {
  name: "HelloWorld",
  methods:{
    openGroupModal($event){
      console.log($event.target);
      // other codes for showing modal and etc...
    }
  }
};
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
</style>