【问题标题】:foreach Azure.Pageable<BlobItem> then throw System.FormatExceptionforeach Azure.Pageable<BlobItem> 然后抛出 System.FormatException
【发布时间】:2020-06-09 11:54:16
【问题描述】:

我参考tutorial 编写代码以将 blob 上传到 IoT 边缘 mcr.microsoft.com/azure-blob-storage:latest 模块以列出容器内的 blob。

            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);
            }

foreach "containerClient.GetBlobsAsync()" 时会抛出 "Unhandled exception"。

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.
  • 环境:
    1. Azure.Storage.Blobs 12.4.4
    2. 存储是 Azure Ubuntu VM 上的一个模块“mcr.microsoft.com/azure-blob-storage:latest”
    3. 代码在 Windows 10、VS Code 1.45.1、.NET Core SDK 上运行:版本:3.1.100 提交:cd82f021f4

这是通过提琴手捕获的来自 GetBlobs() 的 XML。 “创建时间”为空。

<?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>

有谁知道它为什么会抛出异常?是因为我错过了一些配置吗? 谢谢!

【问题讨论】:

  • 我也在GitHub发布了这个问题
  • 请通过 Fiddler 跟踪请求/响应,并将您获得的 XML 响应粘贴为问题列表的一部分。
  • 感谢@GauravMantri-AIS 的评论。我已将 XML 粘贴到问题中。 “创建时间”为空。
  • 感谢分享 XML。它肯定看起来像 SDK 中的一个错误。您可以尝试使用旧版本的 SDK 吗?另外,请使用此 XML 更新 Github 问题,以便 SDK 团队了解此问题。
  • 是的,我尝试过 Azure.Storage.Blobs 12.4.2。它也有例外。如果存储在云端(存储帐户)而不是边缘(模块),则 SDK 都运行良好。

标签: .net azure azure-blob-storage azure-iot-edge


【解决方案1】:

阅读有关它的文档here,基本上问题是 IoT Edge 使用与 REST API 版本 2017-04-17 一致的 blob 存储模块。

IoT Edge 上的 Blob 存储模块使用 Azure 存储 SDK,并且是 与 2017-04-17 版本的 Azure Storage API 一致 阻止 blob 端点。

考虑到这一点,您需要使用面向 REST API 版本 2017-04-17 的 SDK 版本。根据这个link,该SDK 版本将是8.2。您可以从这里安装该版本:https://www.nuget.org/packages/WindowsAzure.Storage/8.2.0

【讨论】:

  • 感谢@Gaurav Mantri-AIS 的回答!我使用“WindowsAzure.Storage”v8.2.0 或 v9.3.3 并重写代码以使用 SDK。它可以在容器内添加一个blob并列出blob。
  • 完美!请接受答案,以便我们关闭它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
  • 1970-01-01
  • 2012-01-29
  • 1970-01-01
相关资源
最近更新 更多