C# 如何使用Azure RM API检测子域是否可用?
在旧世界(在Azure RM API之前),我们可以轻松检测子域可用性,如下所示:C# 如何使用Azure RM API检测子域是否可用?,c#,azure,azure-resource-manager,azure-sdk-.net,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())) { r
public async Task<HostedServiceCheckNameAvailabilityResponse> CheckNameAvailability(string name)
{
using (var client = new ComputeManagementClient(await subscription.GetAuthToken()))
{
return await client.HostedServices.CheckNameAvailabilityAsync(name);
}
}
公共异步任务检查名称可用性(字符串名称)
{
使用(var client=new ComputeManagementClient(wait subscription.GetAuthToken()))
{
返回Wait client.HostedServices.CheckNameAvailabilitySync(名称);
}
}
这将告诉您子域是否可用,并且它工作得很好
在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);
}
}
公共静态异步任务IsubDomainAvailable
(
IAzure,
弦区,
字符串子域
)
{
//托多:这有点像黑客,但这是我们在RM中找到的唯一方法
//用于测试子域可用性的模型。
var rgName=$“dnstest{Guid.NewGuid()}”.ToLower().Replace(“-”,string.Empty);
var resourceGroup=await azure.ResourceGroups.Define(rgName)
.WithRegion(地区)
.CreateAsync();
尝试
{
var ipAddy=await azure.publicipaddress.Define(“dnstest”)
.WithRegion(地区)
.WithExistingResourceGroup(rgName)
.WithLeafDomainLabel(子域)
.CreateAsync();
等待azure.PublicIPAddresss.DeleteByIdAsync(ipAddy.Id);
返回true;
}
捕获(CloudException cEx)
{
如果(cEx.Response.StatusCode==HttpStatusCode.BadRequest
&&cEx.Message.toupper不变量().Contains(“已使用”))
{
返回false;
}
投掷;
}
最后
{
等待azure.ResourceGroups.BeginDeleteByNameAsync(rgName);
}
}
因此,我的问题是,是否有更好/更直接的方法使用Azure RM API检查子域可用性?
所以我的问题是,有没有更好/更直接的方法来检查子域可用性,使用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;
很好——我实际上在同一个对象上使用了CheckDnsNameAvailabilityAsync
,因为它有一个名为Available
的bool?
属性,我不必处理AzureOperationResponse
类/解析响应但是如果你没有给我指出正确的方向,我永远也找不到它而要开机,每次通话只需不到一秒钟的时间非常感谢!:)