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 存储区域?