Neo
Neo

Reputation: 16219

unable to access storage account blob getting BlobContainerValidationError error c#

I'm trying to read data from blob storage to use iothub import job.

I can able to write into blob file successfuly but while reading from blob it gives me below exception -

 await registryManager.ImportDevicesAsync(containerSasUri, containerSasUri);

{"{\"Message\":\"ErrorCode:BlobContainerValidationError;Failed to read devices blob from input container.\",\"ExceptionMessage\":\"Tracking ID:6f06c1ce39f04494b929a2249ce069f2-G:9-TimeStamp:01/06/2019 11:57:23\"}"}

 static string GetContainerSasUri(CloudBlobContainer container)
            {
                // Set the expiry time and permissions for the container.
                // In this case no start time is specified, so the
                // shared access signature becomes valid immediately.
                var sasConstraints = new SharedAccessBlobPolicy();
                sasConstraints.SharedAccessExpiryTime = DateTime.UtcNow.AddHours(24);
                sasConstraints.Permissions =
                  SharedAccessBlobPermissions.Write |
                  SharedAccessBlobPermissions.Read |
                  SharedAccessBlobPermissions.Delete | SharedAccessBlobPermissions.Add | SharedAccessBlobPermissions.Create;

                // Generate the shared access signature on the container,
                // setting the constraints directly on the signature.
                string sasContainerToken = container.GetSharedAccessSignature(sasConstraints);

                // Return the URI string for the container,
                // including the SAS token.
                return container.Uri + sasContainerToken;
            }


   registryManager = RegistryManager.CreateFromConnectionString(connectionString);

                CloudStorageAccount storageAccount = CloudStorageAccount.Parse("connection-string");
                // Create a blob client.

                CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

                CloudBlobContainer container = blobClient.GetContainerReference("test");

                CloudBlockBlob blob = container.GetBlockBlobReference("demo123.txt");

                var containerSasUri = GetContainerSasUri(container);

                // Provision 1,000 more devices
                  serializedDevices = new List<string>();

                for (var i = 0; i < 5; i++)
                {
                    // Create a new ExportImportDevice
                    // CryptoKeyGenerator is in the Microsoft.Azure.Devices.Common namespace
                    var deviceToAdd = new ExportImportDevice()
                    {
                        Id = i+"look",
                        Status = DeviceStatus.Enabled,
                        Authentication = new AuthenticationMechanism()
                        {
                            SymmetricKey = new SymmetricKey()
                            {
                                PrimaryKey = CryptoKeyGenerator.GenerateKey(32),
                                SecondaryKey = CryptoKeyGenerator.GenerateKey(32)
                            }
                        },
                        ImportMode = ImportMode.Create
                    };

                    // Add device to the list
                    serializedDevices.Add(JsonConvert.SerializeObject(deviceToAdd));
                }
                var tt = serializedDevices;
               // Write the list to the blob
               var sb = new StringBuilder();
                serializedDevices.ForEach(serializedDevice => sb.AppendLine(serializedDevice));
                //await blob.DeleteIfExistsAsync();

                using (CloudBlobStream stream = await blob.OpenWriteAsync())
                {
                    byte[] bytes = Encoding.UTF8.GetBytes(sb.ToString());
                    for (var i = 0; i < bytes.Length; i += 500)
                    {
                        int length = Math.Min(bytes.Length - i, 500);
                        await stream.WriteAsync(bytes, i, length);
                    }
                }

                // Call import using the blob to add new devices
                // Log information related to the job is written to the same container
                // This normally takes 1 minute per 100 devices
                JobProperties importJob =
                   await registryManager.ImportDevicesAsync(containerSasUri, containerSasUri);

Upvotes: 1

Views: 287

Answers (1)

Roman Kiss
Roman Kiss

Reputation: 8235

try to setup:

 sasConstraints.SharedAccessStartTime = DateTimeOffset.UtcNow.AddMinutes(-5); 

Update:

The default input blob name is devices.txt. In your implementation, the name of the input blob is demo123.txt, so you have to change:

await registryManager.ImportDevicesAsync(containerSasUri, containerSasUri, "demo123.txt");

Upvotes: 1

Related Questions