Azure Blob Storage SDK for .NET BlobClient.UploadAsync 总是抛出异常,但总是上传文件

Posted

技术标签:

【中文标题】Azure Blob Storage SDK for .NET BlobClient.UploadAsync 总是抛出异常,但总是上传文件【英文标题】:Azure Blob Storage SDK for .NET BlobClient.UploadAsync always throws exception but always uploads the file 【发布时间】:2021-11-06 02:16:14 【问题描述】:

最近我看到 Microsoft.Azure.Storage 已被弃用并开始迁移到新的 Azure.Blob.Storage SDK。除了 UploadAsync 方法在每次上传时都会引发异常之外,一切都运行良好。

我收到 409 The specified blob already exists 错误。但我 100% 确定 blob 不存在,因为它总是使用 GUID 上传并在上传方法之前添加断点并获取 BlobClient url 总是从 blobstorage 返回该 blob 不存在的 XML。

错误被抛出,但我的文件总是被上传。我不需要 overwrite: true 标志,因为它总是新的。

下面是一些示例代码:

public async Task StoreAsync(
        string container,
        string blob,
        byte[] givenBytes,
        CancellationToken cancellationToken = default)
    
        BlobContainerClient containerReference = this.client.GetBlobContainerClient(container);
        await containerReference.CreateIfNotExistsAsync();
        BlobClient blobReference = containerReference.GetBlobClient(blob);

        cancellationToken.ThrowIfCancellationRequested();

        await blobReference.UploadAsync(new BinaryData(givenBytes), CancellationToken.None);
    

请注意,字符串 blob 参数始终是来自其他地方的 GUID。

这是完整的课程:

public class CustomBlobStore : IBlobStore

    private BlobServiceClient client;

    public CustomBlobStore(string accountName, string accountKey)
    
        this.client = new BlobServiceClient(CreateBlobStoreConnectionString(accountName, accountKey));
    

    private static string CreateBlobStoreConnectionString(string accountName, string accountKey)
    
        return "DefaultEndpointsProtocol=https;AccountName=" + accountName + ";AccountKey=" + accountKey;
    

    public async Task StoreAsync(
        string container,
        string blob,
        byte[] givenBytes,
        CancellationToken cancellationToken = default)
    
        BlobContainerClient containerReference = this.client.GetBlobContainerClient(container);
        await containerReference.CreateIfNotExistsAsync();
        BlobClient blobReference = containerReference.GetBlobClient(blob);

        cancellationToken.ThrowIfCancellationRequested();

        await blobReference.UploadAsync(new BinaryData(givenBytes), CancellationToken.None);
    

这是调用函数的方式(附件可以是任何类型的文件):

public async Task<ActionResult> SaveFile(IEnumerable<HttpPostedFileBase> files)

    var file = files.First();
    byte[] fileData;
    using (var ms = new MemoryStream())
    
        file.InputStream.CopyTo(ms);
        fileData = ms.ToArray();
    
    
    StoreAttachmentAsync(Guid.NewGuid(),fileData);


private Task StoreAttachmentAsync(string name, byte[] attachment)
    
        return this.customBlobStore.StoreAsync('/attachments', name, attachment);
    

【问题讨论】:

首先段落在***上是免费的,其次让我们比较一下原始sdk和新sdk,你能不能给两者都显示minimal reproducible example供参考 @TheGeneral 抱歉,这是我第一次在这里提问。希望这会有所帮助。 您是在存储模拟器还是实际的云存储中上传文件?您上传的文件有多大。 @GauravMantri 我们正在直接上传到云存储。这发生在任何文件大小上。即使是 1kb 的文件。 请编辑您的问题并包含您如何调用StoreAttachmentAsync 方法的代码。 【参考方案1】:

问题出在一些底层程序集中,这些程序集在不同项目中存在版本问题。一个项目是 System.Buffers,另一个项目是 System.Text.Encodings.Web。

我没有收到任何错误消息,因为 VS2019 默认关闭了一些异常,因此它们永远不会出现。我刚刚解决了组装​​问题,一切都按预期进行。

很抱歉占用了一些人的时间,但我不知道 VS 有这个问题。

【讨论】:

以上是关于Azure Blob Storage SDK for .NET BlobClient.UploadAsync 总是抛出异常,但总是上传文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 .NET v12 SDK 在 Azure Blob 存储中上传具有指定 ContentType 的 Blob?

如何从适用于 Node.js 的 Azure blob v12 SDK 中删除 blob

使用 .NET SDK 获取 Azure Blob 存储区域?

Azure Blob PHP SDK - 直接从自定义多部分 API 请求上传到 Azure 存储

如何在流明中使用 azure blob?

使用 azure-storage-blob 或 azure-storage 上传和删除 Azure 存储 Blob