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

How do you detect if a sub domain is available using the Azure RM API?

在旧世界(在 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 中,我没有找到任何类似的方法——我写了下面的方法作为最后的手段——但这是一个糟糕的 hack——而且启动速度很慢;如果子域已经存在,它只需要大约 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?

So my question is, is there a better / more direct way to check for sub domain availability, using the Azure RM API?

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

var credentials = SdkContext.AzureCredentialsFactory.FromServicePrincipal(clientId, clientScret,tenantId, AzureEnvironment.AzureGlobalCloud);

NetworkManagementClient networkManagementClient = new NetworkManagementClient(credentials) {SubscriptionId = subscriptionId};

var result= networkManagementClient.CheckDnsNameAvailabilityWithHttpMessagesAsync("location", "DomainLabelName").Result;