2

I refer to the tutorial to write the code for upload a blob to IoT edge mcr.microsoft.com/azure-blob-storage:latest module to list the blobs inside the container.

            BlobServiceClient blobServiceClient = new BlobServiceClient (connectionString);
            string containerName = "customer01";
            BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(containerName);
            string localPath = "./data/";
            string fileName = "quickstart" + Guid.NewGuid ().ToString () + ".txt";
            string localFilePath = Path.Combine (localPath, fileName);

            // Write text to the file
            await File.WriteAllTextAsync (localFilePath, "Hello, blob storage!");

            // Get a reference to a blob
            BlobClient blobClient = containerClient.GetBlobClient (fileName);

            Console.WriteLine ("Uploading to Blob storage as blob:\n\t {0}\n", blobClient.Uri);

            // Open the file and upload its data
            using FileStream uploadFileStream = File.OpenRead (localFilePath);
            await blobClient.UploadAsync (uploadFileStream, true);
            uploadFileStream.Close ();

            Console.WriteLine ("Listing blobs...");

            // List all blobs in the container
            await
            foreach (BlobItem blobItem in containerClient.GetBlobsAsync()) {
                Console.WriteLine ("\t" + blobItem.Name);
            }

It throws the "Unhandled exception" when foreach "containerClient.GetBlobsAsync()".

Unhandled exception. System.FormatException: String '' was not recognized as a valid DateTime.
at System.DateTimeParse.Parse(ReadOnlySpan1 s, DateTimeFormatInfo dtfi, DateTimeStyles styles, TimeSpan& offset) at System.DateTimeOffset.Parse(String input, IFormatProvider formatProvider, DateTimeStyles styles) at System.DateTimeOffset.Parse(String input, IFormatProvider formatProvider) at Azure.Storage.Blobs.Models.BlobItemProperties.FromXml(XElement element) at Azure.Storage.Blobs.Models.BlobItem.FromXml(XElement element) at Azure.Storage.Blobs.Models.BlobsFlatSegment.<>c.<FromXml>b__30_0(XElement e) at System.Linq.Enumerable.SelectEnumerableIterator2.ToList()
at System.Linq.Enumerable.ToList[TSource](IEnumerable1 source) at Azure.Storage.Blobs.Models.BlobsFlatSegment.FromXml(XElement element) at Azure.Storage.Blobs.BlobRestClient.Container.ListBlobsFlatSegmentAsync_CreateResponse(ClientDiagnostics clientDiagnostics, Response response) at Azure.Storage.Blobs.BlobRestClient.Container.ListBlobsFlatSegmentAsync(ClientDiagnostics clientDiagnostics, HttpPipeline pipeline, Uri resourceUri, String version, String prefix, String marker, Nullable1 maxresults, IEnumerable1 include, Nullable1 timeout, String requestId, Boolean async, String operationName, CancellationToken cancellationToken)
at Azure.Storage.Blobs.BlobContainerClient.GetBlobsInternal(String marker, BlobTraits traits, BlobStates states, String prefix, Nullable1 pageSizeHint, Boolean async, CancellationToken cancellationToken) at Azure.Storage.Blobs.Models.GetBlobsAsyncCollection.GetNextPageAsync(String continuationToken, Nullable1 pageSizeHint, Boolean async, CancellationToken cancellationToken)
at Azure.Core.Pipeline.TaskExtensions.EnsureCompleted[T](ValueTask1 task) at Azure.Storage.StorageCollectionEnumerator1.StoragePageable.GetEnumerator()+MoveNext()
at BlobStorageV12.Program.Main(String[] args) in D:\projects\code\dotNetCore\VSCode\BlobQuickstartV12_Git\BlobQuickstartV12\Program.cs:line 38
at BlobStorageV12.Program.
  • Environment:
    1. Azure.Storage.Blobs 12.4.4
    2. The storage is a module "mcr.microsoft.com/azure-blob-storage:latest" on an Azure Ubuntu VM
    3. The code run on Windows 10, VS Code 1.45.1, .NET Core SDK : Version: 3.1.100 Commit: cd82f021f4

This an XML from GetBlobs() caught through fiddler. The "Creation-Time" is empty.

<?xml version="1.0" encoding="UTF-8"?>
<EnumerationResults ServiceEndpoint="http://my edge device storage url " ContainerName="blobfromappa1f9e394-5bd2-4110-b9c5-9396b4a7477b">
   <Blobs>
      <Blob>
         <Name>myFile8eba48b8-475a-4f32-a8a4-c6866cacd703.txt</Name>
         <Properties>
            <Creation-Time />
            <Last-Modified>Wed, 10 Jun 2020 01:51:53 GMT</Last-Modified>
            <Etag>0x8D80CE0D98F7DF6</Etag>
            <Content-Length>14</Content-Length>
            <Content-Type>application/octet-stream</Content-Type>
            <Content-Encoding />
            <Content-Language />
            <Content-MD5>76PGAUTjS5+W39/uoprDKg==</Content-MD5>
            <Cache-Control />
            <Content-Disposition />
            <BlobType>BlockBlob</BlobType>
            <LeaseStatus>unlocked</LeaseStatus>
            <LeaseState>available</LeaseState>
            <ServerEncrypted>false</ServerEncrypted>
            <TagCount>0</TagCount>
         </Properties>
      </Blob>
   </Blobs>
   <NextMarker />
</EnumerationResults>

Does anyone know why it throws the exception? Is it because I missed some config? Thank you!

Ryan Chen
  • 23
  • 5
  • I also post the issue in the [GitHub](https://github.com/Azure/azure-sdk-for-net/issues/12643) – Ryan Chen Jun 09 '20 at 11:57
  • Please trace the request/response through Fiddler and paste the XML response you got as part of listing in the question. – Gaurav Mantri Jun 09 '20 at 12:06
  • Thank @GauravMantri-AIS for your comment. I have pasted the XML in the question. The "Creation-Time" is empty. – Ryan Chen Jun 10 '20 at 02:13
  • Thanks for sharing the XML. It certainly looks like a bug in the SDK. Can you try the same with an older version of the SDK? Also, please update the Github issue with this XML so that SDK team is aware of this issue. – Gaurav Mantri Jun 10 '20 at 02:15
  • Yes, I had tried Azure.Storage.Blobs 12.4.2. It also gots the exception. If the storage is in the cloud(storage account) not on the edge(module), the SDKs both run well. – Ryan Chen Jun 10 '20 at 05:44

1 Answers1

1

Reading the documentation about it here, basically the issue is that IoT edge uses blob storage modules that are consistent with REST API version 2017-04-17.

Blob storage modules on IoT Edge use the Azure Storage SDKs, and are consistent with the 2017-04-17 version of the Azure Storage API for block blob endpoints.

Considering this, you will need to use a SDK version that targets REST API version 2017-04-17. According to this link, that SDK version would be 8.2. You can install that version from here: https://www.nuget.org/packages/WindowsAzure.Storage/8.2.0

Gaurav Mantri
  • 128,066
  • 12
  • 206
  • 241
  • Thanks @Gaurav Mantri-AIS for your answer! I use "WindowsAzure.Storage" v8.2.0 or v9.3.3 and rewrite the code for using the SDK. It can add a blob and list blobs inside the container well. – Ryan Chen Jun 11 '20 at 08:58
  • Perfect! Please accept the answer so that we can close this. – Gaurav Mantri Jun 11 '20 at 08:59