System.ArgumentException: 'должен указать SharedAccessKeyName'

Я получаю эту ошибку от службы обеспечения IoT Azure при создании клиента подготовки.

System.ArgumentException: 'Should specify SharedAccessKeyName'

Я скопировал строку подключения с портала, что может быть не так?

using System;
using System.IO;
using System.Reflection;
using System.Security.Cryptography.X509Certificates;
using System.Threading.Tasks;
using Microsoft.Azure.Devices.Provisioning.Service;

namespace EnrollmentApp
{
    class Program
    {
        private static string ProvisioningConnectionString = "HostName=happybeerhub-us.azure-devices.net;DeviceId=test-device-01;SharedAccessKey=tawpddfqUt3EHZg9a5tUzQ5fjros7zMhKsZbmuXzwXE=";
        private static string EnrollmentGroupId = "test";
        private static string X509RootCertPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), @"key.pfx");        

        static void Main(string[] args)
        {
            RunSample().GetAwaiter().GetResult();
            Console.WriteLine("\nHit <Enter> to exit ...");
            Console.ReadLine();
        }

        public static async Task RunSample()
        {
            Console.WriteLine("Starting sample...");

            using (ProvisioningServiceClient provisioningServiceClient =
                    ProvisioningServiceClient.CreateFromConnectionString(ProvisioningConnectionString))
            {
                #region Create a new enrollmentGroup config
                Console.WriteLine("\nCreating a new enrollmentGroup...");
                var certificate = new X509Certificate2(X509RootCertPath);
                Attestation attestation = X509Attestation.CreateFromRootCertificates(certificate);
                EnrollmentGroup enrollmentGroup =
                        new EnrollmentGroup(
                                EnrollmentGroupId,
                                attestation)
                        {
                            ProvisioningStatus = ProvisioningStatus.Enabled
                        };
                Console.WriteLine(enrollmentGroup);
                #endregion

                #region Create the enrollmentGroup
                Console.WriteLine("\nAdding new enrollmentGroup...");
                EnrollmentGroup enrollmentGroupResult =
                    await provisioningServiceClient.CreateOrUpdateEnrollmentGroupAsync(enrollmentGroup).ConfigureAwait(false);
                Console.WriteLine("\nEnrollmentGroup created with success.");
                Console.WriteLine(enrollmentGroupResult);
                #endregion

            }
        }
    }
}

1 ответ

Решение

Ну, вам не хватает SharedAccessKeyName Таким образом, проверка пытается проверить это, и, поскольку в вашем случае это значение равно нулю, вы получите исключение.

Как вы можете видеть в ServiceConnectionStringBuilder.cs, правильный формат строки подключения

/// A valid connection string shall be in the following format:
/// <code>
/// HostName=[ServiceName];SharedAccessKeyName=[keyName];SharedAccessKey=[Key]
/// </code>

Также в строке 128 вы можете увидеть проверку, которая выдает ваше исключение:

        if (string.IsNullOrWhiteSpace(SharedAccessKeyName))
        {
            throw new ArgumentException("Should specify SharedAccessKeyName");
        }

Теперь вы можете подумать, что ServiceConnectionStringBuilder.cs используется не вашим кодом, а вызовом ProvisioningServiceClient.CreateFromConnectionString создает новый экземпляр ProvisioningServiceClient, который в свою очередь вызывает ServiceConnectionStringBuilder.Parse(), Для получения дополнительной информации см. ProvisioningServiceClient.cs в строках 82, 113 и 123.

РЕШЕНИЕ:

Чтобы решить эту проблему, вы должны предоставить SharedAccessKeyName. Вы должны также рассмотреть возможность использования IotHubConnectionStringBuilder для этого, который уже проверяет ваши свойства при построении строки подключения.

Спрашивающий указал, что ключевым ключом является deviceId согласно этому сообщению в блоге здесь. Таким образом, решение заключается в использовании SharedAccessKeyname=xx вместо DeviceId=xx,

Другие вопросы по тегам