我正在遵循https://learn.microsoft.com/en-us/azure/iot-hub/iot-hub-bulk-identity-mgmt在Azure IoT Hub中批量上传设备标识。这里给出的所有代码都是C#,所以我将其转换为JAVA等效代码。
使用导入设备示例-批量设备资源调配我将获得以下json-
{"id":"d3d78b0d-6c8c-4ef5-a321-91fbb6a4b7d1","importMode":"create","status":"enabled","authentication":{"symmetricKey":{"primaryKey":"f8/UZcYbhPxnNdbSl2J+0Q==","secondaryKey":"lbq4Y4Z8qWmfUxAQjRsDjw=="}}}
{"id":"70bbe407-8d65-4f57-936f-ef402aa66d07","importMode":"create","status":"enabled","authentication":{"symmetricKey":{"primaryKey":"9e7fDNIFbMu/NmOfxo/vGg==","secondaryKey":"nwFiKR4HV9KYHzkeyu8nLA=="}}}
要从blob导入文件,调用以下函数-
CompletableFuture<JobProperties> importJob = registryManager
.importDevicesAsync(inURI, outURI);
在上面的代码中,我们需要为URI提供SAS代码,为此获取容器SAS URI等效代码如下-
static String GetContainerSasUri(CloudBlobContainer container) {
SharedAccessBlobPolicy sasConstraints = new SharedAccessBlobPolicy();
sasConstraints.setSharedAccessExpiryTime(new Date(new Date().getTime() + TimeUnit.DAYS.toMillis(1)));
sasConstraints.setPermissions(EnumSet.of(SharedAccessBlobPermissions.READ, SharedAccessBlobPermissions.WRITE,
SharedAccessBlobPermissions.LIST, SharedAccessBlobPermissions.DELETE));
BlobContainerPermissions permissions = new BlobContainerPermissions();
permissions.setPublicAccess(BlobContainerPublicAccessType.CONTAINER);
permissions.getSharedAccessPolicies().put("testpolicy", sasConstraints);
try {
container.uploadPermissions(permissions);
} catch (StorageException e1) {
e1.printStackTrace();
}
String sasContainerToken = null;
try {
sasContainerToken = container.generateSharedAccessSignature(sasConstraints, "testpolicy");
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (StorageException e) {
e.printStackTrace();
}
System.out.println("URI " + container.getUri() +"?"+ sasContainerToken);
return container.getUri() + "?" + sasContainerToken;
}
现在问题来了。对于输出容器,我得到以下错误-
java.util.concurrent.ExecutionException: com.microsoft.azure.sdk.iot.service.exceptions.IotHubBadFormatException: Bad message format! ErrorCode:BlobContainerValidationError;Unauthorized to write to output blob container. Tracking ID:2dcb2efbf1e14e33ba60dc8415dc03c3-G:4-TimeStamp:11/08/2017 16:16:10
请帮助我了解为什么会出现错误消息格式错误?是SAS密钥生成代码有问题还是我的blob容器没有写入权限?
2条答案
按热度按时间j8yoct9x1#
您是否正在使用服务或帐户级别SAS?引发的错误表明服务未获得授权或未被委派写入指定blob容器的权限。请查看此处的资源,了解如何设置帐户级别SAS以及如何委派对blob容器的读取、写入和删除操作。https://learn.microsoft.com/en-us/rest/api/storageservices/Delegating-Access-with-a-Shared-Access-Signature?redirectedfrom=MSDN“snipped content:“帐户级别SAS,随版本2015-04-05引入。帐户SAS委派对一个或多个存储服务中资源的访问权限。通过服务SAS可用的所有操作也可通过帐户SAS使用。此外,使用帐户SAS,您可以委派对应用于给定服务的操作的访问权限,如“获取/设置服务属性”和“获取服务统计信息”。您还可以委派对服务SAS不允许的blob容器、表、队列和文件共享执行读取、写入和删除操作的访问权限。有关帐户SAS的详细信息,请参阅构造帐户SAS。”
cbjzeqam2#
我在使用私有存储帐户作为导入/输出容器时也遇到了同样的问题。
在我开始使用公共存储帐户后,它工作得很顺利。无论如何,它应该甚至与私人存储帐户一起工作。所以,我提出了一个问题。要了解更多信息,您可以参考这个link。