您如何使用 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;
在旧世界(在 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;