C# System.ArgumentException:';应指定SharedAccessKeyName';

C# System.ArgumentException:';应指定SharedAccessKeyName';,c#,azure-iot-hub,azure-iot-dps,C#,Azure Iot Hub,Azure Iot Dps,创建资源调配客户端时,我从Azure IoT资源调配服务收到此错误 System.ArgumentException: 'Should specify SharedAccessKeyName' 我从门户复制了连接字符串,有什么问题吗 using System; using System.IO; using System.Reflection; using System.Security.Cryptography.X509Certificates; using System.Threading.

创建资源调配客户端时,我从Azure IoT资源调配服务收到此错误

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

            }
        }
    }
}
使用系统;
使用System.IO;
运用系统反思;
使用System.Security.Cryptography.X509证书;
使用System.Threading.Tasks;
使用Microsoft.Azure.Devices.Provisioning.Service;
名称空间注册应用程序
{
班级计划
{
私有静态字符串ProvisioningConnectionString=“HostName=happybeerhub us.azure devices.net;DeviceId=test-device-01;SharedAccessKey=tawpddfqUt3EHZg9a5tUzQ5fjros7zMhKsZbmuXzwXE=”;
私有静态字符串EnrollmentGroupId=“测试”;
私有静态字符串X509RootCertPath=Path.Combine(Path.GetDirectoryName(Assembly.getExecutionGassembly().Location),@“key.pfx”);
静态void Main(字符串[]参数)
{
RunSample().GetAwaiter().GetResult();
Console.WriteLine(“\n退出…”);
Console.ReadLine();
}
公共静态异步任务RunSample()
{
Console.WriteLine(“开始样本…”);
使用(ProvisioningServiceClient ProvisioningServiceClient)=
ProvisioningServiceClient.CreateFromConnectionString(ProvisioningConnectionString))
{
#区域创建新的enrollmentGroup配置
Console.WriteLine(“\n正在创建新的enrollmentGroup…”);
var证书=新的X509Certificate2(X509RootCertPath);
Certification-certificate=X509Certificate.CreateFromRootCertificates(证书);
注册组注册组=
新注册组(
EnrollmentGroupId,
(认证)
{
ProvisioningStatus=ProvisioningStatus.Enabled
};
Console.WriteLine(注册组);
#端区
#区域创建注册组
Console.WriteLine(“\n添加新的注册组…”);
注册组注册组结果=
await provisioningServiceClient.CreateOrUpdatenRollmentGroupAsync(注册组).ConfigureAwait(false);
Console.WriteLine(“\nRollmentGroup创建成功。”);
Console.WriteLine(enrollmentGroupResult);
#端区
}
}
}
}

您缺少了
SharedAccessKeyName
,因此验证会尝试检查它,因为在您的情况下它是空的,所以您会得到异常

正如您在中所看到的,正确的连接字符串格式是

/// 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()
。 更多信息,请参见第82、113和123行

解决方案:

要解决此问题,必须提供SharedAccessKeyName。您还应该考虑使用已经检查了您的属性构建连接字符串的这个。


根据这篇博文,提问者指出关键名称是deviceId。因此,解决方案是使用
SharedAccessKeyname=xx
而不是
DeviceId=xx

这篇文章为我解决了这个问题,关键名称是设备ID:@EvandroPomatti great。我会将您的链接编辑到我的答案中,因为我没有找到任何关于密钥名称本身的内容。也许这也会有所帮助,我是直接从门户网站的DPS访问策略中,在密钥1连接字符串中获得的:SharedAccessKeyName=provisioningserviceowner