клиент управления Azure не возвращает никакой группы ресурсов

#c# #azure

#c# #azure

Вопрос:

Я новичок в Azure. Я пытаюсь создать ResourceGroup, а затем пытаюсь развернуть виртуальную машину. Но я получаю исключение при доступе к группам ресурсов.

Я следую приведенному здесь примеру MSDN: https://learn.microsoft.com/en-us/azure/virtual-machines/windows/csharp-template

Я пробовал другую подписку, но безуспешно. Не удалось найти никаких указателей в Интернете по этой проблеме, или я мог пропустить. Если вы могли бы мне помочь, пожалуйста, дайте мне знать.

Спасибо.

 
//AppId,Key,TenetId are correct
var credentials = SdkContext.AzureCredentialsFactory
                .FromServicePrincipal(ApplicationID, Key, TenetID,
                    new AzureEnvironment()
                    {
                        AuthenticationEndpoint = @"https://login.windows.net/",
                        ManagementEndpoint = @"https://management.core.windows.net/",
                        ResourceManagerEndpoint = @"https://management.azure.com/",
                        GraphEndpoint = @"https://graph.windows.net/",
                    });

 var azure = Azure
                .Configure()
                .WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic)
                .Authenticate(credentials)
                .WithSubscription(AzureProperties.SubscriptionId);

            var groupName = "MyresourceGroup1";
            var location = Region.USWest;

//Exception comes at here.
            var resourceGroup = azure.ResourceGroups.Define(groupName)
                .WithRegion(location)
                .Create();
  

// Сведения об исключении.

 System.ArgumentNullException
  HResult=0x80004003
  Message=Value cannot be null.
Parameter name: value
  Source=mscorlib
  StackTrace:
   at System.String.EndsWith(String value, StringComparison comparisonType)
   at Microsoft.Azure.Management.ResourceManager.Fluent.Authentication.AzureCredentials.<ProcessHttpRequestAsync>d__24.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
   at Microsoft.Azure.Management.ResourceManager.Fluent.ResourceGroupsOperations.<CreateOrUpdateWithHttpMessagesAsync>d__6.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.Azure.Management.ResourceManager.Fluent.ResourceGroupImpl.<CreateResourceAsync>d__26.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.Azure.Management.ResourceManager.Fluent.Core.ResourceActions.Creatable`4.<Microsoft-Azure-Management-ResourceManager-Fluent-Core-ResourceActions-IResourceCreator<IResourceT>-CreateResourceAsync>d__15.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.Azure.Management.ResourceManager.Fluent.Core.DAG.CreatorTaskItem`1.<ExecuteAsync>d__6.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.Azure.Management.ResourceManager.Fluent.Core.DAG.TaskGroupBase`1.<ExecuteNodeTaskAsync>d__14.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.Azure.Management.ResourceManager.Fluent.Core.Extensions.Synchronize[TResult](Func`1 function)
   at Microsoft.Azure.Management.ResourceManager.Fluent.Core.ResourceActions.Creatable`4.Create()
   at pvt_CreateVM.AzureVMManager.CreateVM()
   at pvt_CreateVM.Program.Main(String[] args)

  

Ответ №1:

Я думаю, что в настоящее время происходит сбой кода, потому что вы не установили никакого значения для KeyVaultSuffix свойства, для AzureEnvrionment которого вы инициализировали.

Это предположение, глядя на информацию об ошибке, которой вы поделились, но я говорю это после просмотра соответствующего исходного кода для библиотек управления Azure для .NET

(кстати, это здорово, что любой может это сделать .. вот ссылка)

     public async override Task ProcessHttpRequestAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var adSettings = new ActiveDirectoryServiceSettings
        {
            AuthenticationEndpoint = new Uri(Environment.AuthenticationEndpoint),
            TokenAudience = new Uri(Environment.ManagementEndpoint),
            ValidateAuthority = true
        };
        string url = request.RequestUri.ToString();
        if (url.StartsWith(Environment.GraphEndpoint, StringComparison.OrdinalIgnoreCase))
        {
            adSettings.TokenAudience = new Uri(Environment.GraphEndpoint);
        }

        string host = request.RequestUri.Host;

        // I guess this is where your code is failing currently. 
        if (host.EndsWith(Environment.KeyVaultSuffix, StringComparison.OrdinalIgnoreCase))
        {
  

Как исправить

Если нет веской причины, я бы не инициализировал AzureEnvironment object и вместо этого использовал уже доступные значения, поскольку это гарантировало бы, что все требуемые свойства имеют правильные значения.

Пример: AzureEnvironment.AzureGlobalCloud . Посмотрите здесь все возможные значения

Измените этот код, в котором вы инициализируете AzureEnvironment

 var credentials = SdkContext.AzureCredentialsFactory
            .FromServicePrincipal(ApplicationID, Key, TenetID,
                new AzureEnvironment()
                {
                    AuthenticationEndpoint = @"https://login.windows.net/",
                    ManagementEndpoint = @"https://management.core.windows.net/",
                    ResourceManagerEndpoint = @"https://management.azure.com/",
                    GraphEndpoint = @"https://graph.windows.net/",
                });
  

К этому коду

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

Если по какой-либо причине ни одно из доступных значений среды не является достаточно хорошим, убедитесь, что вы инициализировали все необходимые свойства для AzureEnvironment